Linq To Entities:使用Count()“序列不包含任何元素”

时间:2012-12-17 10:11:30

标签: entity-framework

在我们的应用程序中,我们有一段带有一些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](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中,只有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

2 个答案:

答案 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