2011-07-08 21 views
1

我有一個LINQ到在下列情況下的SQL查詢的問題:LINQ到SQL查詢使用的橋接表

  • 我有有通過橋接表應用「標籤」的項目。
  • 我試圖過濾一個項目列表到一個包含所有指定標籤集合的子集,並返回過濾後的項目列表作爲查詢結果。

表涉及:

Item (ItemId, Name, ...other fields) 
Tag (TagId, TagName) 
Item_Tag(ItemId, TagId) 

舉個例子,如果我有項目與標籤列表:

  • 項目1 W /(Tag1中,與Tag2)
  • 項目2 W /( Tag1,Tag2)
  • Item3 w /(Tag1)

我希望獲得所有項目,其中項目同時具有Tag1和Tag2,其中過濾器要求作爲所需tagIds的int []提供。

假設項目和標籤ID匹配名稱末尾的數字。用於該示例的過濾器將是:

int[] tagFilterConditions = int[2]{1, 2}; 

var query = from i in itemList 
//define filter here 

其中結果將是: 項目1,項目2(不包括項目3 B/C它不與Tag1中與與Tag2標籤)

我在一個艱難的時間搞清楚如何組合這些表來將這個過濾器應用到源列表上,我嘗試過使用predicate builder和各種連接,但是不能得到正確的結果。

感謝,任何幫助......

+0

查詢被改編正確的外鍵關係後,開始工作你已經創建映射(外鍵),這樣你可以使用'item.Tags'(或'item.Item_Tags'),而不必顯式地查詢'Item_Tag'表。 –

回答

0
// Query for all the items in the list 
int[] itemIds = itemList.Select(item => item.ItemId).AsArray(); 
var query = 
    db.Item.Where(item => 
     itemIds.Contains(item.ItemId)); 

// Apply each tag condition 
foreach (int tagid in tagFilterConditions) 
{ 
    int temp = tagid; 
    query = query.Where(item => 
     db.Item_Tag.Exists(item_tag => 
      item_tag.ItemId == item.ItemId && item_tag.TagId == temp))); 
} 
+0

謝謝,我越來越想嘗試在單個LINQ查詢中工作......我確實像上面提到的那樣添加了外鍵關係,並且獲得了以下查詢以便工作以及我會將其作爲下面的另一個答案發布明晰。 – jrob

0

我想回答你的問題是。載有():http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql

這就是我認爲是從該網站你的問題的相關片段:

int[] productList = new int[] { 1, 2, 3, 4 }; 

var myProducts = from p in db.Products 
      where productList.Contains(p.ProductID) 
      select p; 

希望這有助於!

+0

我已經嘗試過使用包含的各種場景,除了我想比較的是在橋表中,而不是在「項目」表本身..也包含()似乎沒有做一個AND比較,其中所有項目數組必須存在。 – jrob

+0

我的不好,我完全錯過了AND要求...試圖考慮替代方案......是否將橋表的全部內容加載到本地存儲器中?它看起來像是一個整數標記表,所以你可以把它放到本地數組中嗎?如果您需要使用時髦的C#特性,而不是轉換爲SQL,那至少可以消除一些潛在的LINQ-to-SQL怪異。 –

0

Here是一些sql。

here是LinqToSql ..

0

得到了下面的查詢使用匿名類型定義的答案上this question.

//the tagId's that the item in itemList must have 
int[] tagFilterConditions = int[2]{1, 2}; 

var query = 
    itemList.Select(i=> new { i, itemTags= item.Item_Tags.Select(it=> it.TagId)}) 
      .Where(x=> tagFilterConditions.All(t=> x.itemTags.Contains(t))) 
      .Select(x=> x.s);