C# 使用GROUPBY和Max将SQL转换为LINQ
甚至可以使用LINQ编写以下查询吗?我已经打了一整天了( 试试这个:C# 使用GROUPBY和Max将SQL转换为LINQ,c#,sql,linq,lambda,C#,Sql,Linq,Lambda,甚至可以使用LINQ编写以下查询吗?我已经打了一整天了( 试试这个: var result = (from pg in ProductGroup join lte in ( from lt in Lot group lt by lt.ProductId into gr select new
var result = (from pg in ProductGroup
join lte in
(
from lt in Lot
group lt by lt.ProductId into gr
select new
{
ProductId = gr.Key,
ShipDate = gr.Max(x => x.DateShipped)
}
)
on pg.ProductId equals lte.ProductId
select new
{
ID = pg.ProductId,
MaxShipDate = lte.ShipDate
}).ToList();
解决方案1 我使用LinqToSQL在LinqPad上测试了这一点
var data = from lt in Lots
group lt by lt.ProductId into grp
join pg in ProductGroups on grp.Key equals pg.ProductId
select new { pg.ProductId,pg.ProductName,ShipDate =grp.Max (g => g.ShipDate)};
data.Dump();
它产生了这种SQL(几乎和您的SQL一样,只是表的顺序被切换)
解决方案2
这是强制执行相关子查询的一种方法,该查询生成与您所需相同的结果,但没有连接/分组依据
var data = from pg in ProductGroups
let sd = Lots.Where (l => l.ProductId == pg.ProductId ).Max(l => l.ShipDate )
select new { pg.ProductId,pg.ProductName,ShipDate =sd};
data.Dump();
它生成了这个SQL
SELECT [t0].[ProductId], [t0].[ProductName], (
SELECT MAX([t1].[ShipDate])
FROM [Lot] AS [t1]
WHERE [t1].[ProductId] = [t0].[ProductId]
) AS [sd]
FROM [ProductGroup] AS [t0]
我希望它能对您有所帮助我不知道这是伪代码还是某种真实语言,但不管它是什么,它都不是C#。感谢您的回复。我使用了第二个分组并选择了最新的项目,花了我一段时间,但我现在有了它。谢谢,这对我有一点帮助。但我必须在第一个表中包含Group By子句上的两个字段并拉取第二个表中的另一项,我必须稍微修改以在LINQ中正常运行。
var data = from pg in ProductGroups
let sd = Lots.Where (l => l.ProductId == pg.ProductId ).Max(l => l.ShipDate )
select new { pg.ProductId,pg.ProductName,ShipDate =sd};
data.Dump();
SELECT [t0].[ProductId], [t0].[ProductName], (
SELECT MAX([t1].[ShipDate])
FROM [Lot] AS [t1]
WHERE [t1].[ProductId] = [t0].[ProductId]
) AS [sd]
FROM [ProductGroup] AS [t0]