针对桥表的LINQ到SQL查询

本文关键字:SQL 查询 LINQ | 更新日期: 2023-09-27 18:01:31

我在以下场景中遇到了LINQ到SQL查询的问题:

  • 我有一些项目通过桥接表应用了"标签"。
  • 我试图将项目列表过滤到包含所有指定标记集的子集,并返回过滤后的项目列表作为查询结果。

表包括:

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

作为一个例子,如果我有一个带有标签的项目列表:

  • Item1 w/(Tag1, Tag2)
  • Item2 w/(Tag1, Tag2)
  • Item3 w/(Tag1)

,我想获得所有项目,其中项目同时具有Tag1和Tag2,其中过滤器需求作为所需tagid的int[]提供。

假设Item和Tag Id与名称末尾的数字匹配。这个例子的过滤器是:

int[] tagFilterConditions = int[2]{1, 2};
var query = from i in itemList
//define filter here

,结果将是:Item1,Item2(不包括item3,因为它没有标记Tag1和Tag2)

我有一个艰难的时间弄清楚如何组合这些表应用源列表上的过滤器,我已经尝试使用谓词构建器和各种连接,但只是不能得到正确的结果。

针对桥表的LINQ到SQL查询

// 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)));
}

我想你的问题的答案在。contains (): 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;

希望这对你有帮助!

下面是一些sql。

这里是LinqToSql..

在定义了适当的外键关系后,使用匿名类型使以下查询工作(该查询改编自此问题的答案)。

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