sis*_*dog 0 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;
Run Code Online (Sandbox Code Playgroud)
编译器错误是这样的(并且它强调了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
Run Code Online (Sandbox Code Playgroud)
注意:根据@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)
Run Code Online (Sandbox Code Playgroud)
它是你加入的"进入"部分 - 一旦你加入"组",连接变量(f在这种情况下)超出了范围 - 你必须使用它gf.或者,鉴于您根本没有在查询中使用 gf,也许您应该into gf完全摆脱该部分,这是一个普通的连接而不是组连接.
但是,这不会给你一个左外连接.如果您想要左外连接,您可能需要:
query = from g in context.GridViews
join f in context.GridViewFavorites on g.ID equals f.GridViewID into gf
from f2 in gf.DefaultIfEmpty()
where g.GridTypeID == id && (g.IsShared == true || g.RepID == me.clsRep.OID)
&& (f2 == null || f2.RepID == me.clsRep.OID)
select g;
Run Code Online (Sandbox Code Playgroud)