LINQ语句不编译

时间:2012-09-02 20:09:11

标签: linq entity-framework

此声明不会编译:

query = from g in context.GridViews 
   join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf
   where g.GridTypeID == id && ( g.IsShared == true || g.RepID == me.clsRep.OID) 
   && f.RepID == me.clsRep.OID
   select g;

编译器错误是这个(并且它强调了where子句的最后一部分:

  

当前上下文中不存在名称“f”

它的逻辑SQL对应物是:

declare @RepID int
declare @GridTypeID int
select @RepID=15, @GridTypeID=5

select g.*,f.*
from
   GridViews g
   left outer join GridViewFavorites f on f.GridViewID = g.ID
where
   g.GridTypeID = @GridTypeID and (g.IsShared = 1 or g.RepID == @RepID) 
   and f.RepID == @RepID

注意:每个@hdv的好捕获SQL样本应该是:

select g.*,f.*
from
   GridView g
   left outer join GridViewFavorite f on f.GridViewID = g.ID and f.RepID = @RepID
where
   g.GridTypeID = @GridTypeID and (g.IsShared = 1 or g.RepID = @RepID) 

3 个答案:

答案 0 :(得分:5)

这是您加入的“进入”部分 - 一旦您加入“组”,加入变量(在这种情况下为f)超出范围 - 您必须使用{{ 1}}而不是。或者,鉴于您根本没有在查询中使用 gf,也许您应该完全摆脱gf部分,这是正常的连接,而不是小组加入。

但是,这不会给你一个左外连接。如果您想要左外连接,您可能需要:

into gf

答案 1 :(得分:0)

LINQ的左连接模式如下:

join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf
from f in gf.DefaultIfEmpty() //missing

Stack Overflow和Google提供了更多信息。

答案 2 :(得分:0)

where子句作用于连接结果,因此f变量不在范围内。