Linq To Entities:使用Count()时出现“Sequence contains no elements”错误

3
在我们的应用程序中,有一段包含一些Linq查询(EF)的代码,有时会抛出异常。这仅发生在最终用户身上,到目前为止我们无法重现它。
从日志文件中,我们得到了以下异常的堆栈跟踪:
System.InvalidOperationException: 序列中不包含元素 at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable`1 sequence) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot) at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable`1 source) at MT3.uctXGrid.LoadLayout(String strUniqueID, Boolean rethrowException, List`1 visibleColumns)
在方法LoadLayout中,只有2个Count()实例,并且它们只是在标准的IQueryable上操作,这些查询基于一个整数字段来查询一个实体类型并选择所有字段(没有聚合或其他任何内容)。
from p in cxt.genData where datId = ID

在堆栈跟踪中,似乎内部正在使用.Single(),如果没有记录,则可能会引发异常。

但是,如果我们只调用.Count(),为什么要使用single呢?

像这样的查询如何执行

(from p in cxt.genData where datId = ID).Count()

如何抛出“序列中不包含元素”异常?

我们遇到了其他一些奇怪的查询问题,我开始怀疑我们的EF版本是否存在任何问题。

目前我们还在使用4.0版(标准版本,随VS2010一起提供)。

有人知道这里可能发生了什么吗?

更新: 这里是我们实际使用的Linq-to-Entities查询。

Dim qryLastLayout = From t In oContext.genGridLayouts Where t.layID = intCurrentLayoutID  
If Not IsNothing(qryLastLayout) AndAlso qryLastLayout.Count <> 0 Then

Dim qryPrintSettings = From p In oContext.genPrintSettings Where p.prtDefault = True  
If Not IsNothing(qryPrintSettings) AndAlso qryPrintSettings.Count <> 0 Then

你是如何使用 Count() 的结果(项目数量或仅用于检查项目是否存在)的? - Chris
我们只是检查 Count() != 0,以便我们知道是否至少有一条记录。我们曾经使用 FirstOrDefault 进行检查,但因为我们遇到了其他奇怪的异常而改变了这种做法。 - Quagmire
如果你想知道是否有任何记录,考虑使用.Any()而不是.Count(),因为它更高效。 - Rui Jarimba
另外,你的代码似乎有一个类型错误:(from p in cxt.genData where datId = ID).Count()。应该是where datId == ID(双等号),对吗? - Rui Jarimba
请看我帖子末尾的更新,其中包含所使用的查询。第一个查询基于主键字段,第二个查询基于布尔字段。 - Quagmire
显示剩余2条评论
2个回答

0
你尝试过使用 .Any() 方法吗?
if(cxt.genData.Any(x => x.datId == ID))
{
     // do something here
}

0

关于Linq to Entities,需要注意的一件事是Count()的语义不是.NET的语义,而是底层数据源的语义(这在某种程度上削弱了整个语言集成方面的优势,但没办法...)。我不认为这会引起像你遇到的问题,但你永远不知道。

更多细节请参阅MSDN链接:http://msdn.microsoft.com/en-us/library/vstudio/bb738551.aspx#sectionSection5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接