2

T-SQL:

declare @postlocations table (locationid int)
insert into @postlocations
select locationid
from dbo.PostLocations
where PostId = 162172

select t.*
from dbo.Themes t
inner join dbo.ThemeLocations tl on t.ThemeId = tl.ThemeId
inner join @postlocations pl on tl.LocationId = pl.locationid

私がこれまでに持っているLINQエンティティ:

var postLocations = e.SomePost.Locations; // pre-fetched, e.g materialized ICollection<Post>
var themes = (from t in db.Themes
             join q in postLocations on t.Locations.Select(l => l.LocationId) equals q.LocationId
             select t).ToList();

しかし、コンパイラはjoin、型引数を推論できないというキーワードについて不平を言っています。

何か案は?

4

3 に答える 3

1

それらのオブジェクトが元々データベースからのものであっても、SQLテーブルをメモリ内のオブジェクトリストと結合できるとは思いません。

オブジェクトのメモリ内リストを ID (整数) のリストに変換し、それを結合または含む/サブ選択で使用します。EF は、SQL の生成時に ID のリストをパラメーターに変換できます。

于 2012-04-11T06:36:50.223 に答える
1

LocationId結合の問題は、 ( )のコレクションがt.Locations.Select(l => l.LocationId単一のLocationId. ロケーションのコレクションを 1 つのロケーションに持つテーマに参加しようとしています。

これを使用して修正できるはずですContains

var themes = (from t in db.Themes
             join q in postLocations 
             on t.Locations.Select(l => l.LocationId).Contains(q.LocationId)
             select t).ToList();

postLocationsまたは、パラメーターとして aを渡すことについて EF が不平を言う場合は、試すことができます

// I'd materialize this but you may not have to
var postLocationIds = postLocations.Select(p => p.LocationId).ToList();

var themes = db.Themes.Where(t => t.Locations.Any(l => 
                 postLocationIds.Contains(l.LocationId))).ToList();
于 2012-04-12T03:17:38.287 に答える
0

編集

これはどう

 ///your sql query
select t.* from dbo.Themes t
 inner join dbo.ThemeLocations tl on t.ThemeId = tl.ThemeId
 inner join @postlocations pl on tl.LocationId = pl.locationid 

//linq query for that
from t in teams
join from tl in teamlocation on t.themid = tl.ThemeID
join from pl in postlocation on tl.temeid = pl.temeid
select t;

組織

確かではありませんが、 let キーワードを使用して試すことができます

var themes = (from t in db.Themes
              let location = t.Locations

            join q in postLocations on location.LocationId equals q.LocationId 
            select t).ToList(); 
于 2012-04-11T05:47:44.237 に答える