Linq FirstOrDefault

时间:2012-01-16 21:52:34

标签: linq

我有以下LINQ查询:

    Manager mngr = (from tr in DataContext.Manager
                    where tr.Name = "Jones").FirstOrDefault();

如何检查查询是否返回1条记录 因为我做不到。计算得到计数。

4 个答案:

答案 0 :(得分:14)

首先,这不是有效的查询。使用查询语法(from blah in blah ...)时,必须具有select子句。它应该更像是:

var manager =
    (from n in DataContext.Manager
    where n.Name == "Jones"
    select n).FirstOrDefault();

要回答您的问题,在查询中调用FirstOrDefault()将返回查询的第一个结果或类型的默认值(在这种情况下最有可能是null)。对于您的目标,由于查询可能包含多个结果,因此无法充分利用。

如果您希望验证查询仅返回单个结果,则应使用SingleOrDefault()方法。它将返回查询生成的一个项,如果为空则返回默认值null,如果有多个项则返回异常。

如果您不想抛出异常,可能更容易将前两个结果放入列表并验证您只有一个。

var managers =
    (from m in DataContext.Manager
    where m.Name == "Jones"
    select m).Take(2).ToList();
if (managers.Count == 1)
{
    // success!
    var manager = managers.First();
    // do something with manager
}
else
{
    // error
}

答案 1 :(得分:0)

您可以使用SingleOrDefault扩展方法表示查询只返回一个结果。

Manager manager = (from tr in DataContext.Manager 
                   where tr.ID = "2323").SingleOrDefault();

然而,它并没有告诉您是否有0结果或超过1.

答案 2 :(得分:0)

如果要计算记录,请计算查询的结果,而不使用 FirstOrDefault。

var mngr = (from tr in DataContext.Manager
                where tr.ID = "2323")
if(mngr.Count() == 0)
   ....
else
   Manager manager = mngr.First(); //No need for default since we know we have a record.

您仍然可以先在mngr上运行或默认运行以获取特定的经理。

答案 3 :(得分:0)

您正在使用where条件的ID,我认为您应该已经保证此查询只返回一个结果。

如果您的问题没有结果,请检查MSDN titleFirstOrDefault()的使用情况。

            int[] numbers = { };
            int first = numbers.FirstOrDefault();
            Console.WriteLine(first);

            /*
             This code produces the following output:

             0
            */