我有以下3个表作为一个简单的“商品标签”模式的一部分:
==Items==
<代码>H19条件varchar <代码>H210描述varchar <代码>H212<代码>H113活动位<代码>H214<代码>F215
==Tags==
==TagMap==
我想写一个LINQ查询来返回与标签列表匹配的项目(例如TagId = 2,3,4,7)。在我的应用程序上下文中,项的示例将是“计算机监视器”、“礼服衬衫”、“吉他”等,而标签的示例将是“电子产品”、“服装”等。我通常使用SQL In语句来完成此操作。
发布于 2009-05-22 02:31:25
就像这样
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子句)。
发布于 2009-05-22 02:18:35
给定项目数组:
var list = new int[] {2,3,4}
使用:
where list.Contains(tm.TagId)
发布于 2009-05-22 03:52:39
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();
https://stackoverflow.com/questions/896123
复制相似问题