我有以下LINQ查询:
Manager mngr = (from tr in DataContext.Manager
where tr.Name = "Jones").FirstOrDefault();
如何检查查询是否返回1条记录 因为我做不到。计算得到计数。
答案 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 title中FirstOrDefault()
的使用情况。
int[] numbers = { };
int first = numbers.FirstOrDefault();
Console.WriteLine(first);
/*
This code produces the following output:
0
*/