在我们的应用程序中,我们有一段带有一些Linq查询(EF)的代码,有时会引发异常。
这只发生在最终用户身上,到目前为止我们无法重现。
从日志文件中我们获得了以下异常的stacktrace:
System.InvalidOperationException:Sequence不包含任何元素 在System.Linq.Enumerable.Single [TSource](IEnumerable
1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable
1序列) at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle [TResult](IEnumerable1 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
中,只有Count()
的2个实例,它们只是在标准IQueryable
上运行,它根据一个整数字段询问实体类型并选择所有字段(没有聚合或任何东西)。
例如:
from p in cxt.genData where datId = ID
在堆栈跟踪中,似乎正在使用内部.Single()
,如果没有记录,可能会抛出异常。
但是,如果我们只是调用.Count()
?
如何查询
(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
答案 0 :(得分:0)
您是否尝试过使用.Any()方法?
if(cxt.genData.Any(x => x.datId == ID))
{
// do something here
}
答案 1 :(得分:0)
要知道wq Linq to Entities的一件事是Count()
的语义不是.NET的语义,而是基础数据源的语义(有点破坏了整个语言集成方面,但是很好...... )。我不认为这会导致像你这样的问题,但你永远不会知道。
MSDN链接包含更多详细信息:http://msdn.microsoft.com/en-us/library/vstudio/bb738551.aspx#sectionSection5