【发布时间】: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)
);
...但我不知道其中的效率会有多高。
我将如何使用ohn 和mit 编写能够有效匹配“John”、“Johnathan”、“Smith”、“Smitty”等的 linq 查询?
【问题讨论】:
-
遗憾的是,SqlFunctions.PatIndex() 不适用于我的用例 - 我的目标是 Oracle 数据库。 :-(
-
那么您最好的选择可能是编写一个原始 SQL 查询。我会为此写一个答案。
标签: c# linq linq-to-sql ef-core-2.2