LINQ复杂搜索查询建议

时间:2018-09-29 07:52:34

标签: c# linq

我需要一些我想做的LINQ逻辑的帮助

使用EF,我得到了以下结果集:

enter image description here

基本上我要实现的是,如果用户要查找具有TagID 3和TagID 4的元素,则它应该仅返回undefinedcreateProvider is not defined

这应忽略Low, Medium,因为此元素没有TagID 4

如果用户只想要包含TagID 3的元素,则应返回LowLow, Medium,因为它们都包含TagID 3

我试图这样做只是为了让Low回来(更困难的逻辑),但没有成功。

Low, Medium

请朝着正确的方向迈出一步

2 个答案:

答案 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();