0

此语句不会编译:

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) 
4

3 回答 3

5

它是您加入的“加入”部分——一旦你加入“加入”一个组,加入变量(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;
于 2012-09-02T20:11:23.780 回答
0

LINQ 的左连接模式如下所示:

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

更多信息可在 Stack Overflow 和 Google 上找到。

于 2012-09-02T20:11:26.153 回答
0

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

于 2012-09-02T20:11:44.770 回答