在 .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 中实现。
我正在开发 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
FirstOrDefault
只允许它生成连接和 SELECT TOP 1
(或等效),这要容易得多。
它只是没有在 EF 中实现。