2011-02-02 61 views
1

我現在有3個表:如何讓兩個連接生成一個選擇?

News 
ID | Title 

Tag 
ID | Name 

TaggedContent 
ContentID | TagID 

而且我有兩個上下文對象: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次選擇的情況下離開。

你的加入是一個簡單的身份檢查,所以你可以這樣做:

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

現在都在新聞臺的ID的本地副本 - 的第一選擇。然後將您的第一個「東西」更改爲:

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

由於延遲執行,第二條語句本身不會生成選擇。現在,您可以在第三條語句刪除ToList()

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

而當你終於枚舉something,你有你的第二選擇。

0

使用DataLoadOptions類在創建DataContext時傳入。

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

這樣做的餘下的數據加入。

+0

DataLoadOptions是Linq-To-Sql非實體框架的一部分。 – 2011-02-03 09:17:17

相關問題