C# 具有group by子句和聚合函数的LINQ to SQL

C# 具有group by子句和聚合函数的LINQ to SQL,c#,linq,C#,Linq,对于在access数据库中编写的查询,我需要等效的LINQ到SQL查询。下面是access数据库中的查询 SELECT Table1.ID, Table1.CODE, MIN (Table1.COST) FROM Table1 GROUP BY Table1.ID, Table1.CODE 在这个查询中,我得到了给定重复代码的最小成本 下面的查询给出错误“无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问权限声明匿名类型成员。” 您需要告诉它如何调用anon类型中的最后一个值(

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

SELECT  Table1.ID, Table1.CODE, MIN (Table1.COST) 
FROM Table1 GROUP BY Table1.ID, Table1.CODE
在这个查询中,我得到了给定重复代码的最小成本

下面的查询给出错误“无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问权限声明匿名类型成员。”


您需要告诉它如何调用anon类型中的最后一个值(请注意,对于直接成员访问成员(
g.Key.ID
g.Key.code
),可以推断名称(
ID
code
):

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

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

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

select new {g.Key.ID, g.Key.CODE, MinimumCost = g.Min(uh=>uh.COST)};
如果属性值是属性或字段访问(根据ID和代码),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) };

您应该能够在一句话中做到这一点:

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

我认为MS指南指的是首字母缩写,因此
Id
是有效的;p@Marc:我实际上检查了指南,它们明确地指出
Id
Ok
。其他两个字母的首字母缩略词/缩写完全是大写。当然,MS也遵循这一原则;p(模糊地指向
Min(…)
method…@Marc:Min方法很好-它是三个字母…(但“id”有时是id,有时是id。)3个字母的规则是大写-我指的是缩写指导,它建议不要缩短。在v7文档中,示例是
GetWin
vs
GetWindow
。我想这归结为对
Min
vs
Minimum
-meh的主观调用,我不必担心;p
select new { Id = g.Key.ID,
             Code = g.Key.CODE,
             MinimumCost = 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) }