0
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();

我遇到了异常:本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains 运算符除外。

我猜这与 .Sum() 调用有关...如何修改它以避免异常?

4

2 回答 2

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)
}
于 2012-11-09T14:18:18.600 回答
2

它抛出异常是因为您尝试使用visits,而不是因为您正在调用 sum()。如果您包含创建访问列表的代码部分可能会有所帮助...

那是从哪里来的,可以在同一语句中查询吗?

所以这样的事情会起作用:

Context...Select(bc => new MacroPaymentValue() 
{
    //stuff
    ValueForPayment =     bc.visits.sum(...)
});

事实上,我注意到在这个查询的最后你强制它使用 ToArray()。如果您对访问查询执行相同的操作,它会将查询转换为本地序列。只需去掉访问查询中的 ToArray() 部分,就会为您留下一个可用于其他 linq 查询的 IQueryable。

因此,如果访问确实需要来自 TblCodeType 之外,您可以确保不使用 ToArray()。

基本上,您不能在 linq to sql 查询中使用本地数组(大部分情况下)。不过,您可以在 linq to sql 查询中使用另一个查询。如果您调用 ToArray() 或 ToList(),它将实际运行查询,获取结果并将其存储在本地序列中(数组或列表取决于您调用的内容。)但是,如果您不这样做,则在您真正开始使用值之前,查询不会运行。这样查询就保持为一个查询,并且可以安全地用于其他查询。

于 2012-11-09T14:20:20.740 回答