LINQ to SQL使用本地集合抛出SQL异常

时间:2012-11-09 13:55:17

标签: c# .net linq linq-to-sql sqlexception

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()调用有关...如何修改它以避免异常?

2 个答案:

答案 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(),它将实际运行查询,获取结果并将其存储在本地序列中(根据您调用的数组或列表。)但是,如果您不这样做,则在实际开始使用值之前,查询不会运行。这样查询就会保持查询状态,并可以安全地用于其他查询。