【问题标题】:linq where list contains all matched in listlinq,其中列表包含列表中的所有匹配项
【发布时间】:2016-03-24 17:28:13
【问题描述】:

我有三个表 Keyword、Product 和 KeywordProduct。

  • 如果我尝试过滤“the”,则返回 A 和 B 产品
  • 如果我尝试过滤“矩阵”,则只返回 B 产品

但是当我过滤“矩阵”时,我也会得到 B 和 A。我只需要获得 B 记录。

代码如下:

var keywordTermList = ("the matrix").Split(' ');

db.Products
.Where(product => product.ProductKeywords.All(k => keywordTermList.Contains(k.Keyword.Name)))

关键词表

+------------+---------+ |关键字 ID |姓名 | +------------+---------+ | 1 |醒来| | 2 |力 | | 3 |的| | 4 |矩阵 | +------------+---------+

产品关键字表

+------------+------------+ |关键字 ID |产品编号 | +------------+------------+ | 3(该)|一个 | | 2(力)|一个 | | 1(觉醒)|一个 | | 3(该)|乙| | 4(矩阵)|乙| +------------+------------+

产品表有 A 和 B 记录。

我该怎么做呢?过滤“矩阵”时如何只得到 B。

【问题讨论】:

  • var keywordTermList = searchString.Split(' ').Where(t => !ignore.Contains(t)).toList(); -- 其中ignore{ "a", "an", "the", ... } 的列表以及您想忽略的任何其他内容。
  • 是的,我知道。这只是示例记录。
  • 以上似乎不是您真正的查询,因为它最有可能过滤更多数据(例如,如果产品 B 有第三个单词)而不是返回更多记录。
  • 你说得对。这会发生......

标签: c# .net linq entity-framework-6


【解决方案1】:

如果你想让子集完全匹配超集

var query = products.Where(p => !keywordListTerm.Except(p.ProductKeywords.Select(pk => pk.Name)).Any());

这是完整的例子

public class Program
{
    public static void Main(string[] args)
    {

        Product A = new Product();
        A.Name = "A";
        A.ProductKeywords = new List<Keyword>() { 
            new Keyword(){Name = "the"},
            new Keyword(){Name = "force"},
            new Keyword(){Name = "awakens"}
        };

        Product B = new Product();
        B.Name = "B";
        B.ProductKeywords = new List<Keyword>() { 
            new Keyword(){Name = "the"},
            new Keyword(){Name = "matrix"}
        };

        List<Product> products = new List<Product>() { A, B };

        var keywordListTerm = ("the force matrix").Split(' ');

        var query = products.Where(p => !keywordListTerm.Except(p.ProductKeywords.Select(pk => pk.Name)).Any());

        foreach (var item in query) { 
            Console.WriteLine(item.Name);
        }

        Console.ReadKey();
    }
}

public class Product {
    public string Name = string.Empty;
    public List<Keyword> ProductKeywords;
}

public class Keyword
{
    public string Name;

}

希望这会有所帮助。

【讨论】:

  • 虽然这在技术上对于一般 LINQ 来说是正确的,但我不知道您是否注意到了 entity-framework-6 标记,因此上述内容无法转换为 SQL 查询,并且会因运行时异常而失败。
  • @IvanStoev 哦!我不知道不是所有的 LINQ 都可以成功转换为 SQL。不知道它是如何为 OP 工作的。
  • 是的,这很奇怪 - 如果它对他有用,为什么不接受它:/但我猜这不是我们的问题 :)
  • 如果您知道更好的解决方案,请告诉我。我不想面对任何未来的问题。
  • @tsubasaetkisi 您是否在 EF6 设置中运行上述查询?有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2012-05-26
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多