首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将EF LINQ方法语法转换为查询语法

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

Stack Overflow用户
提问于 2012-11-13 08:38:43
回答 2查看 839关注 0票数 5

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

代码语言:javascript
复制
var q2 = list.GroupBy(x => x.GroupId)
             .Select(g => g
                 .OrderByDescending(x => x.Date)
                 .FirstOrDefault());

我认为这应该可行,但它没有:

代码语言:javascript
复制
var q1 = from x in list
         group x by x.GroupId into g
         from y in g
         orderby y.Date descending
         select g.FirstOrDefault();

下面是一个测试程序,如果您想玩它的话:

代码语言:javascript
复制
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));
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-13 08:48:24

反射器给了我以下内容:

代码语言:javascript
复制
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,因为小组不会是空的,但不会有什么影响。)

票数 3
EN

Stack Overflow用户

发布于 2012-11-13 08:43:09

在理解查询语法中没有FirstOrDefault操作符(如果将项分组,那么至少有一个项将出现在组中,因此您需要First),但其他内容的翻译如下:

代码语言:javascript
复制
var q1 = from c in list
         orderby c.Date descending
         group c by c.GroupId into g
         select g.First();

诀窍是,如果您按顺序分组,组中的项目将被排序。以及:

q1.SequenceEqual(q2)返回true

根据LINQ,该查询生成与嵌套完全相同的SQL。

UPDATE也是我的坏消息-- First将使用LINQ对象,或者LINQ,但是对于LINQ实体,您应该使用FirstOrDefault。第二个注意事项--这些查询(我的和嵌套的查询)将为LINQ生成相同的SQL,但是使用EF,我的顺序不会被应用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13357656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档