mysql - 将带有子查询连接的 sql 查询转换为 linq 语句

标签 mysql linq

我正在尝试将以下 sql 查询转换为 LINQ 语句

SELECT t.*
FROM    (
        SELECT Unique_Id, MAX(Version) mversion
        FROM    test
        GROUP BY Unique_Id
    ) m INNER JOIN
    test t  ON m.Unique_Id = t.Unique_Id AND m.mversion = t.Version

LINQ 语句

var testalt = (from altt in CS.test
group altt by altt.Unique_Id into g
join bp in CS.alerts on g.FirstOrDefault().Unique_Id equals bp.Unique_Id
select new ABCBE
{
ABCName= bp.Name,
number = bp.Number,
Unique_Id =  g.Key,
Version = g.Max(x=>x.Version)
});

我收到 where 子句的错误。请帮忙

SQL FIDDLE

最佳答案

这不是简单直接的转换,但您可以使用 linq 方法语法完成同样的事情。第一个查询是对表达式树执行的,然后您从针对 CS.alerts 的分组中加入该表达式树。这将来自 CS.test 查询的表达式树合并到 CS.alerts 的表达式树中,以连接两个表达式树。

评估表达式树以构建查询并根据枚举执行所述查询。在这种情况下,枚举是 ToList() 调用,但从枚举中获得结果的任何内容都将执行查询。

var query1 = CS.test.GroupBy(x => x.Unique_Id);
var joinResult = CS.alerts.Join(query1, 
   alert => new { ID = alert.Unique_Id, Version = alert.Version },
   test => new { ID = test.Key, Version = test.Max(y => y.Version }, 
   (alert, test) => new ABCBE { 
      ABCName = alert.Name, 
      number = alert.Number, 
      Unique_Id = test.Key, 
      Version = test.Max(y => y.Version)
    }).ToList();

因为 query1 仍然是一个 IQueryable 并且您正在使用 CS.alerts(我猜 CS 是您的数据上下文)它应该加入并构建查询以在 ToList() 枚举上执行。

关于mysql - 将带有子查询连接的 sql 查询转换为 linq 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30182448/

相关文章:

c# - 使用 Linq 更新嵌套属性

c# - 无法将类型 System.Collections.Generic.List<IEnumerable> 隐式转换为 <IEnumerable

mysql - 如何指定在 MySql 中的 select * 查询输出中仅显示某些特定字段?

mysql - 如何在mysql time_zone表中插入AET

php - 上传文件到服务器时在MySQL数据库中保存文件路径

asp.net - Page Cycles - 将数据输入数据库的正确方法

c# - Linq - 在列表中按周分组

mysql - 根据先前删除的子行删除父行

php - 从MySQL数据库中显示php中的所有表名

c# - 如何获取不在另一个列表中的列表元素C#