Linq版本的SQL“IN”语句

我有以下3个表作为一个简单的“项目标记”模式的一部分:

== ==项目

  • ItemId int
  • 品牌varchar
  • 名称varchar
  • 价钱
  • 条件varchar
  • 说明varchar
  • 有效位

== ==标签

  • TagId int
  • 名称varchar
  • 有效位

== == TagMap

  • TagMapId int
  • TagId int(fk)
  • ItemId int(fk)
  • 有效位

我想写一个LINQ查询来带回与标签列表匹配的项目(例如TagId = 2,3,4,7)。 在我的应用程序中,项目的例子是“计算机监视器”,“衬衫”,“吉他”等,标签的例子是“电子”,“服装”等等。我通常用SQL IN声明。

就像是

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子句)。

给定数组项目:

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

使用:

 where list.Contains(tm.TagId) 

查看使用Linq To Sql创buildIN查询

 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(); 

你可以简单地使用,

 var TagIds = {12, 32, 42} var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId)); 
 string[] names = {"John", "Cassandra", "Sarah"}; var results = (from n in db.Names where names.Contains(n.Name) select n).ToList();