Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接、组和和和不起作用的Linq_C#_Linq - Fatal编程技术网

C# 连接、组和和和不起作用的Linq

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

我不熟悉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
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;}
}