针对桥表的LINQ to SQL查询

时间:2011-07-08 22:18:49

标签: c# sql linq linq-to-sql tagging

我在以下场景中遇到LINQ to 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的所有项目,其中过滤器要求作为所需tagIds的int []提供。

假设项目和标签ID与名称末尾的数字匹配。此示例的过滤器将是:

int[] tagFilterConditions = int[2]{1, 2};

var query = from i in itemList
//define filter here

结果如下: Item1,Item2(不包括第3项b / c,它没有用Tag1和Tag2标记)

我很难弄清楚如何组合这些表以在源列表上应用该过滤器,我尝试使用predicate builder和各种连接,但却无法获得正确的结果。

谢谢,任何帮助......

4 个答案:

答案 0 :(得分:0)

我认为你的问题的答案是在.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;

希望这有帮助!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Here是一些sql。

here是LinqToSql ..

答案 3 :(得分:0)

在定义了正确的外键关系后,使用匿名类型进行了以下查询:查询是根据this question.

上的答案进行调整的
//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);