在 .Where() 中使用 .SingleOrDefault() 将引发以下异常:- System.NotSupportedException 未被用户代码处理

using .SingleOrDefault() inside .Where() will raise the following exception:- System.NotSupportedException was unhandled by user code

我正在开发 asp.net mvc-4 网络应用程序,我正在使用 Entity Framework 5。现在我有以下模型方法:-

 public IQueryable<TMSStorageDevice> CustomerSD(int customerid)
        {


            var customerSiteIds = entities.SiteDefinitions.Where(a => a.AccountDefinitions1.SingleOrDefault().ORG_ID == customerid).Select(a2 => a2.SITEID).ToList();
        }

现在这将引发以下错误:-

System.NotSupportedException was unhandled by user code
  HResult=-2146233067
  Message=The methods 'Single' and 'SingleOrDefault' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SingleTranslatorBase.TranslateUnary(ExpressionConverter parent, DbExpression operand, MethodCallExpression call)
       at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
       at System.Data.Objects.ELinq.ExpressionConver

我能够通过替换 (SingleOrDefault()):-

来解决这个问题
a.AccountDefinitions1.SingleOrDefault().ORG_ID

与 (FirstOrDefault()):-

a.AccountDefinitions1.FirsteOrDefault().ORG_ID

所以有人可以对这种行为提出建议吗?我的意思是为什么 FirstOrDefault() 在这种情况下会与 SingleorDefault() 不同?

因为 SingleOrDefault 会要求它生成 SQL 以确保不超过 1 个外部行。本质上,如果计数 > 1

,它必须创建一个 returns 没有行的连接 然而,

FirstOrDefault 只允许它生成连接和 SELECT TOP 1(或等效),这要容易得多。

它只是没有在 EF 中实现。