2011-02-02 22 views
1

私は現在、3つのテーブルがあります。2つの結合が1つの選択を生成する方法

News 
ID | Title 

Tag 
ID | Name 

TaggedContent 
ContentID | TagID 

をそして私は2つのコンテキストがオブジェクトを持っている:NewsEntitiesTagsEntities

は私がニュースで使用されるすべてのタグを選択したい、自分のアプリケーションで私が持っている:

static void Main(string[] args) 
{ 
    IEnumerable<dynamic> something = null; 

    IEnumerable<News.Data.News> news = null; 
    IEnumerable<Tags.Data.Tag> tags = null; 
    IEnumerable<TaggedContent> tagged = null; 

    using (var db = new NewsEntities()) 
    { 
     news = db.News.ToList(); // 1 select 
    } 

    using (var db = new TagsEntities()) 
    { 
     something = news.Join(db.TaggedContents.ToList(), 
      n => n.ID, 
      tc => tc.ContentID, 
      (n, tc) => new { tc.TagID }); // 1 select 

     something = something.Join(db.Tags.ToList(), 
      tid => tid.TagID, 
      t => t.ID, 
      (tid, t) => t); // 1 select 
    } 

    var result = something; 
} 

私は現在を3つ選択しています。どうすれば2に減らすことができますか?または可能であれば、エンティティをマージせずに1に減らしたいと考えています。

答えて

2

異なるコンテキストのエンティティに参加しているため、2つ以下の選択肢から離脱することはできません。 - 最初の選択あなたは今、ニュースのテーブル内のIDのすべてのローカルコピーを持っている

var ids = db.News.Select(x => x.ID).ToList(); 

:あなたがこれを行うことができるように

あなたの参加は、簡単な身元確認です。

something = db.TaggedContents 
    .Where(x => ids.Contains(x.ContentID)) 
    .Select(x => new { x.TagID }); 

この2番目のステートメントは、遅延実行のために選択を生成しません。これで、3番目のステートメントでToList()を削除することができます。

something = something.Join(db.Tags, 
    tid => tid.TagID, 
    t => t.ID, 
    (tid, t) => t); 

そして、あなたが最終的にsomethingの上に列挙したとき、あなたはあなたの第2の選択を持っています。

0

DataContextの作成で渡されたDataLoadOptionsクラスを使用します。

 DataLoadOptions options = new DataLoadOptions(); 
     db.LoadOptions = options; 
     options.LoadWith((News n) => n.Tags); 

残りのデータを結合するにはどうすればよいですか。

+0

DataLoadOptionsは、Linq-To-Sqlではないエンティティフレームワークの一部です。 –

関連する問題