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。代わりに使用する必要があります。または、実際にクエリでまったく使用 していない場合は、その部分を完全に削除して、グループ結合ではなく通常の結合にする必要があります。gfinto 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 に答える