免责声明:我在SO上找不到another question的所有答案。

在LINQPad中准备查询时,我观察到一些结果以IQueryable的形式返回,而某些结果以DbSet的形式返回。

查询的所有版本都可以在这里找到:https://dotnetfiddle.net/r1ghBv

// returns IQueryable<Message>
// Time : 133 ms
from m in Messages
    where m.MessageStatusId < 5 && (
        from mm in Messages
        where mm.MessageStatusId < 5
        group mm by mm.F_Id into g
        select g.Key
    ).Contains(m.F_Id)
    select m




// returns DbQuery<Message>
// Time : 112 ms
from mm in Messages
where mm.MessageStatusId < 5
group mm by mm.F_Id into g
from m in g
select m


在LINQPad中,DbQuery版本具有89行IL,而对于IQueryable,它为171行。

DbQuery是一个类,而IQueryable是一个接口,并且DbQuery显然似乎具有更多的方法。但是我很想知道,如果我要在C#.NET 4.5.2和Entity Framework 6.x中使用以下查询,哪个可能具有更好的SQL性能?

问题:


如何在上面的查询中确定返回类型?
DbQuery版本在实际查询之前在LINQPad的SQL选项卡中有7个额外的SQL查询,而在IQueryable版本中LINQPad甚至只是直接生成查询,尽管DbQuery为什么要快一些?那是因为EF Library类DbQuery吗?

最佳答案

返回类型与消息类型的一行相同。这两个查询之间的时差可以从查询中的第二个“ from”开始解释。在第一个查询中,您将通过N x N枚举,而在第二个查询中,您将通过N x M枚举。M是第二个“ from”。在第二个查询中,“ g”是所有消息的子集。

10-06 00:00