Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.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# 使用GROUPBY和Max将SQL转换为LINQ_C#_Sql_Linq_Lambda - Fatal编程技术网

C# 使用GROUPBY和Max将SQL转换为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

甚至可以使用LINQ编写以下查询吗?我已经打了一整天了(

试试这个:

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]