针对桥表的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)
我有一个艰难的时间弄清楚如何组合这些表应用源列表上的过滤器,我已经尝试使用谓词构建器和各种连接,但只是不能得到正确的结果。
// 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);