2009-05-22 40 views
19

我有以下3個表爲 「標記項」 模式的簡單的一部分:LINQ的版本 「IN」 的聲明

== ==項目

  • 項目Id INT
  • 品牌VARCHAR
  • 名稱VARCHAR
  • 價款
  • 條件VARCHAR
  • DESCR iption VARCHAR
  • 有效位

== ==標籤

  • 標籤識別INT
  • 名稱VARCHAR
  • 有效位

== == TagMap

  • TagMapId詮釋
  • 標籤識別INT(FK)
  • 項目Id INT(FK)
  • 有效位

我想寫一個LINQ查詢帶回匹配的標籤列表條件的項目(例如, TagId = 2,3,4,7)。在我的應用程序上下文中,項目的例子是「計算機監視器」,「襯衫襯衫」,「吉他」等,標籤的例子是「電子產品」,「服裝」等。我通常會用SQL IN聲明。

+0

爲什麼內連接的不是在這裏者優先?你知道如果Context.TagMaps包含10條記錄,它將在後臺迭代36次,不管事實是否匹配。 – Pankaj 2012-04-03 12:41:40

+2

您可能會發現[LINQ中的SQL查詢](http://www.codeducky.org/sql-queries-in-linq/#where-in)有幫助。這是LINQ中表示的常見SQL查詢列表。 – 2015-03-24 05:51:56

回答

42

喜歡的東西

var TagIds = new int[] {12, 32, 42}; 

var q = from map in Context.TagMaps 
     where TagIds.Contains(map.TagId) 
     select map.Items; 

應該做你所需要的。這將生成一個In(12,32,42)子句(如果我沒有弄錯,更具體地說是一個參數化的IN子句)。

14

給項目的數組:

var list = new int[] {2,3,4} 

使用:

where list.Contains(tm.TagId) 
+0

我不明白這將如何工作給我3表模式。 – 2009-05-22 02:30:42

1
List<int> tagIds = new List<int>() {2, 3, 4, 7}; 
int tagIdCount = tagIds.Count; 
    // 
// Items that have any of the tags 
// (any item may have any of the tags, not necessarily all of them 
    // 
var ItemsAnyTags = db.Items 
    .Where(item => item.TagMaps 
    .Any(tm => tagIds.Contains(tm.TagId)) 
); 

    // 
// Items that have ALL of the tags 
// (any item may have extra tags that are not mentioned). 
    // 
var ItemIdsForAllTags = db.TagMap 
    .Where(tm => tagIds.Contains(tm.TagId)) 
    .GroupBy(tm => tm.ItemId) 
    .Where(g => g.Count() == tagIdCount) 
    .Select(g => g.Key); 
    // 
var ItemsWithAllTags = db.Items 
    .Where(item => ItemsIdsForAllTags.Contains(item.ItemId)); 

//runs just one query against the database 
List<Item> result = ItemsWithAllTags.ToList(); 
1

您可以簡單地使用,

var TagIds = {12, 32, 42} 
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId)); 
0
string[] names = {"John", "Cassandra", "Sarah"}; 

var results = (from n in db.Names 
       where names.Contains(n.Name) 
       select n).ToList();