C# 连接、组和和和不起作用的Linq
我不熟悉Linq和实体框架, 下面是我想要的代码和结果。 在那里,LINQPad可以完美地工作,但当我将它带到net.core时,我有一个错误: .Sum(tot=>tot.b.Price)无法转换。要么重写 以可翻译的形式进行查询,或切换到客户端评估 显式地插入对AsEnumerable()的调用, AsAsAsyncEnumerable()、ToList()或ToListSync() 客户C# 连接、组和和和不起作用的Linq,c#,linq,C#,Linq,我不熟悉Linq和实体框架, 下面是我想要的代码和结果。 在那里,LINQPad可以完美地工作,但当我将它带到net.core时,我有一个错误: .Sum(tot=>tot.b.Price)无法转换。要么重写 以可翻译的形式进行查询,或切换到客户端评估 显式地插入对AsEnumerable()的调用, AsAsAsyncEnumerable()、ToList()或ToListSync() 客户 Id-名称 1-Jhon 2-亨利 3-最大值 作品 Id-价格-客户Id 1-10-1 2-20-2
Id-名称
1-Jhon
2-亨利
3-最大值
作品
Id-价格-客户Id
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();
结果:Jhon 50
亨利70
最多30个
在内存中运行Linq查询(即在List类的实例上)或在具有Entity Framework的DB上运行Linq查询时,会有所不同 在第一种情况下,代码刚刚执行,在第二种情况下,代码在SQL查询中翻译。显然,并不是所有的东西都是可以翻译的 一种解决方案可以是: -确保类“Clients”引用了类“Works”,即 我建议改进实体之间的导航,而不是使用过于复杂的查询 编辑:此解决方案无效,因为未指定分组依据。 你可能会发现这篇文章很有用: 基本上,您需要以这种方式实现反向导航(即从作品到客户端)
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)。选择(g=>new{Client=g.Key,Price=g.Sum(w=>w.Price)})。tolistsync()关于错误消息,您不了解什么?翻译部分还是“明确切换到客户评估”部分?为什么要按价格分组。所以只需要按ClientId分组。如果您将
按新{a.Name,b.Price}分组新{a,b}到g
到组b。按新a.Name分组新{a,b}到g
(并重构查询的其余部分),会发生什么?没门!!!!还是一样的错误。我已经查过课了,一切都好。你能解释一下我如何处理你的建议吗?谢谢。我们开始了!!!!!我终于纠正了你的建议。我用一个工作列表和一个新的total字段重新分配了模型客户机。现在一切都很好。我应该发布解决方案吗?再次感谢。马克斯:如果成功了,请你把答案标记为正确好吗?非常感谢。
var result = await dbContext.Clients.Select(c => new {c.Name, c.Works.Sum(w => w.Price)}).ToListAsync();
public class Works {
public string Id {get;set;}
public double Price {get;set;}
public Clients Client {get;set;}
}