实体框架,为什么要生成这个sql?

时间:2013-07-29 17:59:24

标签: sql linq entity-framework linq-to-entities

当我查看EF生成的SQL查询时,我看到了

SELECT [extent1].ID as ID,
[extent1].Name as Name 
From( 
Select myview.ID as ID,
myview.Name as Name
From myview) AS [extent1]
Where([Extent1].ID = @p_linq_0)

为什么外部选择发生在内部选择?我有一个非常大的表,我可以通过外部查询轻松获取记录,但整个查询结合时间超时。

我的Linq查询

var result = from i in invitationEntity.Invitations
.Where(a=>a.id == inviationId)
select i;

我正在使用SQL 2012& EF5& LINQ。

有没有办法“强制”更简单的查询?

2 个答案:

答案 0 :(得分:5)

因为你在最后再次使用LINQ方法调用“SELECT”。

var result = from i in invitationEntity.Invitations
.Where(a=>a.id == inviationId)
select i;

最后一行选择i,没用,但是EF并不知道它是否有用,你可以简单地避免它。

var result = invitationEntity.Invitations
.Where(a=>a.id == inviationId);

您仍然可以枚举结果并获取所有内容。

好对不起,我忘了添加,你不必使用“from”,你可以简单地使用.Where(表达式)

如果您想使用LINQ关键字,那么您可以这样使用它,

var result = from i in invitationEntity.Invitations
where i.id == invitationId
select i;

您不能混用LINQ关键字和LINQ扩展方法。

答案 1 :(得分:0)

我会说那个

   var result = from i in invitationEntity.Invitations
               .Where(a=>a.id == inviationId)
                select i;

    a=>a.id == inviationId

来自a=>生成

  Select myview.ID as ID,
  myview.Name as Name
  From myview

所以a是[extent1]

你应该使用"标准" where子句

           from i in invitationEntity.Invitations
                  where i.id == inviationId
            select i;