如何使用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));
}发布于 2012-11-13 08:48:24
反射器给了我以下内容:
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,因为小组不会是空的,但不会有什么影响。)
发布于 2012-11-13 08:43:09
在理解查询语法中没有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)返回true
根据LINQ,该查询生成与嵌套完全相同的SQL。
UPDATE也是我的坏消息-- First将使用LINQ对象,或者LINQ,但是对于LINQ实体,您应该使用FirstOrDefault。第二个注意事项--这些查询(我的和嵌套的查询)将为LINQ生成相同的SQL,但是使用EF,我的顺序不会被应用。
https://stackoverflow.com/questions/13357656
复制相似问题