Amounts =
Context.Ppm_TblCodeType
.Where(bc => bc.OrganisationId == Contract.OrganisationId)
.Select(bc => new MacroPaymentValue
{
Code = bc.CodeTypeCode,
ShortName = bc.ShortDescription,
ValueForPayment = visits
.Where(v => v.Detail.CodeTypeCode == bc.CodeTypeCode)
.Sum(v => v.Detail.Charge != null ? v.Detail.Charge.Value : 0)
}).ToArray();
我遇到异常:除了Contains运算符之外,本地序列不能用于查询运算符的LINQ to SQL实现。
我猜这与.Sum()调用有关...如何修改它以避免异常?
答案 0 :(得分:3)
这种情况正在发生,因为您尝试使用visits
作为查询的一部分,这是代码中的本地序列,而LINQ to SQL无法将其转换为SQL。
查看您的代码我认为,一旦您将查询结果存储在内存中,您最好填充ValueForPayment。类似的东西:
Amounts =
Context.Ppm_TblCodeType
.Where(bc => bc.OrganisationId == Contract.OrganisationId)
.Select(bc => new MacroPaymentValue
{
Code = bc.CodeTypeCode,
ShortName = bc.ShortDescription,
CodeTypeCode = bc.CodeTypeCode,
ValueForPayment = 0
}).ToArray();
foreach(var bc in Amounts)
{
bc.ValueForPayment = visits
.Where(v => v.Detail.CodeTypeCode == bc.CodeTypeCode)
.Sum(v => v.Detail.Charge != null ? v.Detail.Charge.Value : 0)
}
答案 1 :(得分:2)
它正在抛出异常,因为你试图使用visits
,而不是因为你正在调用sum()。如果您包含要创建访问列表的代码部分,可能会有帮助...
来自何处,是否可以在同一声明中查询?
所以这样的事情会起作用:
Context...Select(bc => new MacroPaymentValue()
{
//stuff
ValueForPayment = bc.visits.sum(...)
});
事实上,我注意到在这个查询的末尾你强迫它ToArray()。如果您在访问查询时执行相同操作,则会将查询转换为本地序列。只是在访问查询中删除ToArray()部分将为您留下可以在其他linq查询中使用的IQueryable。
因此,如果访问确实需要来自TblCodeType之外,您可以确保不要使用ToArray()。
基本上,你不能在linq to sql查询中使用本地数组(大多数情况下。)你可以在linq中使用另一个查询来查询sql。如果您调用ToArray()或ToList(),它将实际运行查询,获取结果并将其存储在本地序列中(根据您调用的数组或列表。)但是,如果您不这样做,则在实际开始使用值之前,查询不会运行。这样查询就会保持查询状态,并可以安全地用于其他查询。