我有一个像这样的分组声明:
group s by c into g
select new ObjectDto
{
KeyObject = new KeyObjectDto
{
ObjectId = g.Key.Id
},
GroupedObjects = g.Select(a => a)
};
如果我修改此ObjectDto
以获得IEnumerable
KeyObjects
并修改如下所示的查询,我会看到性能提升的2倍:
group s by c.Id into g
select new ObjectDto
{
KeyObjects = KeyObjectsDbSet.Where(x => x.Id == g.Key).Select(x => new KeyObjectDto
{
ObjectId = x.Id
}),
GroupedObjects = g.Select(a => a)
};
如果我从第一个语句中查看生成的SQL,看起来c
分组使用的不仅仅是Id
来比较两行是否唯一(尽管EF是意识到Id
是主键,但我不确定这些都在这里发挥作用。我也注意到,如果改为尝试:
KeyObject = KeyObjectsDbSet.Where(x => x.Id == g.Key).Select(x => new KeyObjectDto
{
ObjectId = x.Id
}).FirstOrDefault()
我立刻失去了任何性能优势。
所以我的问题是:
(1)为什么第二个语句的性能优于第一个语句(仅仅是因为行/对象比较)?
(2)是否可以按对象分组,但是告诉LINQ使用要进行该分组的特定属性(属性集)?例如:group s by c using c.Id into g