3

在我们的应用程序中,我们有一段带有一些 Linq 查询 (EF) 的代码,有时会引发异常。

这仅发生在最终用户身上,到目前为止我们无法重现它。

从日志文件中,我们得到以下异常堆栈跟踪:

1 source) at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerableSystem.InvalidOperationException:序列在 MT3.uctXGrid.LoadLayout的 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](IQueryable1 源)的System.Linq.Enumerable.Single[TSource](IEnumerable 1 序列)中不包含任何元素(字符串 strUniqueID、布尔 rethrowException、List`1 visibleColumns)

在该方法LoadLayout中,只有 2 个实例Count(),它们只是在标准IQueryables 上运行,它们基于一个整数字段询问实体类型并选择所有字段(没有聚合或任何东西)。

前任:

from p in cxt.genData where datId = ID

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

但是,如果我们只是调用,为什么要使用 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
4

2 回答 2

0

您是否尝试过使用 .Any() 方法?

if(cxt.genData.Any(x => x.datId == ID))
{
     // do something here
}
于 2012-12-17T12:39:32.653 回答
0

需要注意的一件事是,Linq to Entities 的语义Count()不是 .NET 的语义,而是底层数据源的语义(在某种程度上破坏了整个语言集成方面,但是哦……)。我不认为这会导致像你这样的问题,但你永远不知道。

包含更多详细信息的 MSDN 链接:http: //msdn.microsoft.com/en-us/library/vstudio/bb738551.aspx#sectionSection5

于 2012-12-17T13:37:56.133 回答