在我们的应用程序中,有一段包含一些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)
在方法
从日志文件中,我们得到了以下异常的堆栈跟踪:
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
.Any()
而不是.Count()
,因为它更高效。 - Rui Jarimba(from p in cxt.genData where datId = ID).Count()
。应该是where datId == ID
(双等号),对吗? - Rui Jarimba