带有聚合函数的group by子句的LINQ to SQL

时间:2011-08-10 09:56:34

标签: c# linq

对于在访问数据库中编写的查询,我需要等效的LINQ to SQL查询。以下是访问数据库中的查询。

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)
};

3 个答案:

答案 0 :(得分:3)

您需要指定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) };

答案 1 :(得分:1)

您需要告诉它要在anon-type中调用最后一个值的内容(请注意,对于直接成员访问成员(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)};

答案 2 :(得分:0)

你应该能够在一个声明中这样做:

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) }