首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL "IN“语句的Linq版本

SQL "IN“语句的Linq版本
EN

Stack Overflow用户
提问于 2009-05-22 02:14:04
回答 6查看 52.1K关注 0票数 26

我有以下3个表作为一个简单的“商品标签”模式的一部分:

==Items==

  • ItemId int
  • 品牌varchar
  • 名称varchar
  • 价格货币

<代码>H19条件varchar <代码>H210描述varchar <代码>H212<代码>H113活动位<代码>H214<代码>F215

==Tags==

  • TagId int
  • Name varchar
  • Active bit

==TagMap==

  • TagMapId int
  • TagId int (fk)
  • ItemId int (fk)
  • Active bit

我想写一个LINQ查询来返回与标签列表匹配的项目(例如TagId = 2,3,4,7)。在我的应用程序上下文中,项的示例将是“计算机监视器”、“礼服衬衫”、“吉他”等,而标签的示例将是“电子产品”、“服装”等。我通常使用SQL In语句来完成此操作。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-05-22 02:31:25

就像这样

代码语言:javascript
复制
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子句)。

票数 56
EN

Stack Overflow用户

发布于 2009-05-22 02:18:35

给定项目数组:

代码语言:javascript
复制
var list = new int[] {2,3,4}

使用:

代码语言:javascript
复制
where list.Contains(tm.TagId)
票数 16
EN

Stack Overflow用户

发布于 2009-05-22 03:52:39

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/896123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档