我需要一些我想做的LINQ逻辑的帮助
使用EF,我得到了以下结果集:
基本上我要实现的是,如果用户要查找具有TagID 3和TagID 4的元素,则它应该仅返回undefinedcreateProvider is not defined
这应忽略Low, Medium
,因为此元素没有TagID 4
如果用户只想要包含TagID 3的元素,则应返回Low
和Low, Medium
,因为它们都包含TagID 3
我试图这样做只是为了让Low
回来(更困难的逻辑),但没有成功。
Low, Medium
请朝着正确的方向迈出一步
答案 0 :(得分:1)
如果每个ID仅可使用一次标记(即,没有具有相同ID和相同标记ID的项目),则此方法应该有效。
我认为EF无法用于转换为SQL->首先实现。
var q = result.ToList();
var tagIDs = new HashSet<int>() { 3, 4 };
IEnumerable<string> itemContents =
q.Where(x => tagIDs.Contains(x.TagID)). // Keep only the tags we're interested in
GroupBy(x => x.Id). // Group the items by ID
Where(g => (g.Count() == tagIDs.Count)). // Select the groups having the right number of items
SelectMany(g => g.Select(x => x.ItemContent)). // Extract ItemContent
Distinct(); // Remove duplicates
答案 1 :(得分:0)
我不知道这是否会误食,这是一个例子:
var data = new[]
{
new { Id = 12, TagID = 3, ItemContent = "Low" },
new { Id = 13, TagID = 3, ItemContent = "Low, Medium" },
new { Id = 13, TagID = 4, ItemContent = "Low, Medium" },
};
var search = new List<int>(new[] { 3, 4 });
var result = data
// group the items on ItemContent
.GroupBy(item => item.ItemContent, d => d, (k, g) => new { ItemContent = k, g })
// only select groups when all searchitems are found in a list of TagID
.Where(groupedItem => search.All(i => groupedItem.g.Select(y => y.TagID).Contains(i)))
// select the result
.Select(groupedItem => groupedItem);
foreach (var r in result)
Console.WriteLine(r.ItemContent);
Console.ReadLine();