LINQ性能组按对象vs组按ID

时间:2016-11-23 18:06:55

标签: c# sql-server entity-framework linq

我有一个像这样的分组声明:

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

0 个答案:

没有答案