c# - 将 EF LINQ 方法语法转换为查询语法

标签 c# linq linq-query-syntax

您将如何使用 LINQ 查询语法编写此完全相同查询?

var q2 = list.GroupBy(x => x.GroupId)
             .Select(g => g
                 .OrderByDescending(x => x.Date)
                 .FirstOrDefault());

我认为这应该有效,但没有:

var q1 = from x in list
         group x by x.GroupId into g
         from y in g
         orderby y.Date descending
         select g.FirstOrDefault();

这里有一个测试程序,如果你想玩的话:

public class MyClass
{
    public int Id { get; set; }
    public string GroupId { get; set; }
    public DateTime Date { get; set; }

    public override bool Equals(object obj)
    {
        var item = obj as MyClass;
        return item == null ? false : item.Id == this.Id;
    }
}

static void Main(string[] args)
{
    var list = new List<MyClass> 
    {
        new MyClass { GroupId = "100", Date=DateTime.Parse("01/01/2000"), Id = 1},
        new MyClass { GroupId = "100", Date=DateTime.Parse("02/01/2000"), Id = 2},
        new MyClass { GroupId = "200", Date=DateTime.Parse("01/01/2000"), Id = 3},
        new MyClass { GroupId = "200", Date=DateTime.Parse("02/01/2000"), Id = 4},
        new MyClass { GroupId = "300", Date=DateTime.Parse("01/01/2000"), Id = 5},
        new MyClass { GroupId = "300", Date=DateTime.Parse("02/01/2000"), Id = 6},
    };

    var q1 = from x in list
                group x by x.GroupId into g
                from y in g
                orderby y.Date descending
                select g.FirstOrDefault();

    var q2 = list.GroupBy(x => x.GroupId)
                    .Select(g => g
                        .OrderByDescending(x => x.Date)
                        .FirstOrDefault());

    Debug.Assert(q1.SequenceEqual(q2));
}

最佳答案

Reflector 给我以下信息:

var q2 = from x in list
         group x by x.GroupId into g
         select (
             from x in g
             orderby x.Date descending
             select x).FirstOrDefault();

这看起来是正确的。

(正如 Lazy 所说,不需要 FirstOrDefault 代替 First,因为组不会它不是空的,但它不会伤害。)

关于c# - 将 EF LINQ 方法语法转换为查询语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13357656/

相关文章:

c# - 端口是从 SQL Server 自动收集的吗?

c# - 如何对 foreach 循环 linq lambda 表达式进行 OR 运算

sql - NHibernate Linq 中前 5 个元素的总和

c# - 哪个快 : Query Syntax vs. 循环

c# - 将字符串解析为 LINQ 查询

c# - 带有 Windows 窗体的 XNA - 打开新窗口

c# - 禁用 Windows Phone 应用程序中的屏幕截图工具

c# - ORA-00604:递归SQL级别1发生错误ORA-01882:找不到时区区域

c# - Linq:添加额外的 'Where' 子句给出随机结果

c# - 使用 linq 查询连接两个列表 - C#