LINQ到SQL的groupby子句与聚合函数

本文关键字:函数 子句 groupby SQL LINQ | 更新日期: 2023-09-27 18:04:56

我需要等效的LINQ到SQL查询在access数据库中编写的查询。下面是access数据库中的查询:

SELECT  Table1.ID, Table1.CODE, MIN (Table1.COST) 
FROM Table1 GROUP BY Table1.ID, Table1.CODE

在这个查询中,我得到COST,它是给定重复CODE的最小值

下面的查询给出错误"无效的匿名类型成员声明符"。匿名类型成员必须使用成员赋值、简单名称或成员访问来声明。"

var ptQ = from i in
(from uh in ptTable
 select new
 {
     uh.ID, uh.CODE, uh.COST
 })
group i by new { i.ID, i.CODE }
into g
select new
{
    g.Key.ID, g.Key.CODE, g.Min(uh => uh.COST)
};

LINQ到SQL的groupby子句与聚合函数

您需要为Min调用指定属性名称:

select new {g.Key.ID, g.Key.CODE, MinimumCost = g.Min(uh=>uh.COST)};

如果属性值是一个属性或字段访问(根据ID和CODE), c#编译器将推断出一个名称,所以上面的等价于:

select new { ID = g.Key.ID,
             CODE = g.Key.CODE,
             MinimumCost = g.Min(uh=>uh.COST) };

我个人认为,如果它们不是习惯的c#名称,我会在任何地方指定它们的名称,否则:

select new { Id = g.Key.ID,
             Code = g.Key.CODE,
             MinimumCost = g.Min(uh=>uh.COST) };

您需要告诉它如何调用非类型中的最后一个值(注意,对于直接成员访问成员(g.Key.IDg.Key.CODE),可以推断出名称(分别为IDCODE):

select new {g.Key.ID, g.Key.CODE, MinCost = g.Min(uh=>uh.COST)};

如果需要,还可以为其他成员提供显式名称:

select new {Id = g.Key.ID, Code = g.Key.CODE, MinCost = g.Min(uh=>uh.COST)};

您应该能够在一个语句中完成:

from i in Table1
group i by new { i.ID, i.CODE } into g
select new { g.Key.ID, g.Key.CODE, COST = g.Min(x => x.COST) }