【问题标题】:Linq with join, group and sum not working带有加入,组和总和的Linq不起作用
【发布时间】:2020-07-06 23:44:26
【问题描述】:

我是 Linq 和实体框架的新手, 下面的代码和我想要的结果。 在那里 LINQPad 工作得很好,但是当我把它带到 net.core 我有这个错误:

.Sum(tot => tot.b.Price) 无法翻译。要么重写 以可翻译的形式查询,或切换到客户评估 通过插入对 AsEnumerable() 的调用,显式地 AsAsyncEnumerable()、ToList() 或 ToListAsync()

客户
ID - 名称
1 - 乔恩
2 - 亨利
3 - 最大

作品
ID - 价格 - ClientId
1 - 10 - 1
2 - 20 - 2
3 - 30 - 3
4 - 40 - 1
5 - 50 - 2

var result = await (from a in dbContext.Clients
                join b in dbContext.Works on a.Id equals b.ClientId
                        where b.Price != 0
                        group new {a, b} by new {a.Name, b.Price} into g
                        select new
                        {
                            Name = g.Key.Name,
                            Total = g.Sum(tot => tot.b.Price)//here is the problem!!!!!!!
                        }).ToListAsync();

结果:
约翰 50
亨利 70
最多 30 个

【问题讨论】:

  • 您对错误信息有什么不明白的地方?翻译部分还是“明确切换到客户评估”部分?
  • 你为什么按价格分组。所以只需要按 ClientId 分组即可。
  • 如果将group new {a, b} by new {a.Name, b.Price} into g 更改为group b.Price by new a.Name into g(并重构查询的其余部分)会发生什么?

标签: c# linq


【解决方案1】:

在内存中(即在 List 类的实例上)或使用 Entity Framework 在 DB 上运行 Linq 查询时会有所不同。

在第一种情况下,代码只是被执行,在第二种情况下,代码在 SQL 查询中被翻译。显然,并非所有内容都可以翻译。

一种解决方案可能如下:

-确保“Clients”类引用了“Works”类,即

 public class Clients {
       public string Id {get;set;}
       public string Name {get;set;}
       public IEnumerable<Works> Works {get;set;}
    }

-重写你的查询

 var result = await dbContext.Clients.Select(c => new {c.Name, c.Works.Sum(w => w.Price)}).ToListAsync();

我建议改进实体之间的导航,而不是使用过于复杂的查询。

编辑:此解决方案不起作用,因为未指定分组依据。 您可能会发现这篇文章很有用:how to sum a column in entity framework

基本上,你需要以这种方式实现反向导航(即从 Works 到 Clients)

public class Works {
    public string Id {get;set;}
    public double Price {get;set;}
    public Clients Client {get;set;}
}

并使用以下查询:

dbContext.Works.GroupBy(w => w.Client.Name).Select(g => new { Client = g.Key, Price = g.Sum(w => w.Price)}).ToListAsync( )

【讨论】:

  • 不可能!!!!仍然是同样的错误。我已经检查了课程,一切都很好。你能解释一下我该如何处理你的建议吗?谢谢。
  • 我们来了!!!!!!终于对你的建议做出了正确的选择。我用一个作品列表和一个新的字段重新设计了模型客户。现在一切都很好。我应该发布解决方案吗?再次感谢。最大
  • 如果有效,您能否将答案标记为正确?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多