我在以下场景中遇到LINQ to SQL查询问题:
参与的表格:
Item (ItemId, Name, ...other fields)
Tag (TagId, TagName)
Item_Tag(ItemId, TagId)
例如,如果我有一个带标签的项目列表:
我希望获得项目同时具有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和各种连接,但却无法获得正确的结果。
谢谢,任何帮助......
答案 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)
答案 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);