将 EF LINQ 方法语法转换为查询语法



如何使用 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,因为组不会是空的,但这并没有什么处。

理解查询语法中没有FirstOrDefault运算符(如果项目被分组,那么组中至少会出现一个项目,所以你需要First),但其他东西是这样翻译的:

var q1 = from c in list
         orderby c.Date descending
         group c by c.GroupId into g
         select g.First();

诀窍是,如果您按顺序进行分组,则组中的项目将被排序。瞧:

q1.SequenceEqual(q2)返回真

顺便说一句,根据LINQ Pad,此查询生成与具有嵌套from x in g orderby x.Date descending select x的查询完全相同的SQL

更新 还有我的坏 - First 将与 LINQ to Objects 或 LINQ to SQL 一起使用,但对于 LINQ to Entities,您应该使用 FirstOrDefault .第二点说明 - 这些查询(我的和嵌套查询)将为 LINQ to SQL 生成相同的 SQL,但对于 EF,我的排序不适用。

相关内容

  • 没有找到相关文章

最新更新