【问题标题】:EF Core Linq Query to Select Rows That Match From a List of PossibilitiesEF Core Linq 查询以从可能性列表中选择匹配的行
【发布时间】:2020-01-29 18:45:39
【问题描述】:

假设DbSet<Thing> things;并且Thing 有一个Name 属性。

如果我想检索与名称列表匹配的事物列表,这非常简单:

var names = new List<string>{"John", "Jacob", "Jinkelheimer", "Smith"};

return things.Where(t => names.Contains(t.name));

但是,如果我想匹配部分名称可能性的列表怎么办?

var nameBits = (new List<string>{"ohn", "mit"}).ToLower();

// this doesn't seem good / right / efficient
things.Where(t => nameBits
   .Select(bit => EF.Functions.Like(t.Name, $"%{bit}%")
   .Any(m => m)
);

// I could also go with:

things.Where(t => nameBits
     .Select(bit => t.Name.Contains(bit)).Any(m => m)
);

...但我不知道其中的效率会有多高。 我将如何使用ohnmit 编写能够有效匹配“John”、“Johnathan”、“Smith”、“Smitty”等的 linq 查询?

【问题讨论】:

  • 遗憾的是,SqlFunctions.PatIndex() 不适用于我的用例 - 我的目标是 Oracle 数据库。 :-(
  • 那么您最好的选择可能是编写一个原始 SQL 查询。我会为此写一个答案。

标签: c# linq linq-to-sql ef-core-2.2


【解决方案1】:

Entity Framework 的优点在于,当 C# 前端的事情无法解决时,您总是可以使用原始 SQL。

var names = context.Names
    .FromSqlRaw("select Name from Names where name like %{0}%", name)
    .ToList();

Writing Raw SQL Queries in Entity Framework Core

【讨论】:

  • 我如何使用 SQL 说“where name like %a% or %b% or %c%” - 基本上是like“此数组中的任何项目”?
  • 名称列表是否足够小,您可以将整个列表放入内存并在其上使用普通的 Linq?
  • 我认为我们正在研究全文搜索。
  • 我不知道我是否可以将该列编入索引 - 你认为这样的事情可能有用吗? stackoverflow.com/a/41230612/127888
  • 值得一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2020-10-08
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多