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

标签 c# asp.net asp.net-mvc entity-framework entity-framework-5

我正在开发一个 asp.net mvc-4 web 应用程序,我正在使用 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

,它必须创建一个不返回任何行的连接 但是,

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

它只是没有在 EF 中实现。

关于c# - 在 .Where() 中使用 .SingleOrDefault() 将引发以下异常 :- System. NotSupportedException 未被用户代码处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33883680/

相关文章:

javascript - 绕过验证jquery

jquery - 如何在 mvc razor 中显示/隐藏网格行

javascript - 使用条件语句将值分配给依赖于另一个文本字段的文本字段

c# - 使用三元运算符填充 SqlCommand 参数

javascript - 将 .Net LINQ 查询转换为 Angular 2 TypeScript/JavaScript

c# - 在 PCL 中使用 HttpClient 进行异步调用

ASP.NET - 重定向 301

asp.net - 如何从.NET调用node.js REST API

c# - 一次在多个表中插入/更新数据的最佳实践

c# - Action<List<Something>> 逆变限制