ef core 2.0 使用包含过滤器搜索多列

umu*_*sen 3 c# entity-framework .net-core ef-core-2.0

假设实体Patient存在于上下文中,该实体已使用数据库优先方法生成,因此我无法修改数据库。

public class Patient
{
   public string Id { get; set; }
   public string Surname { get; set; }
   public string Forename { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想按姓名过滤患者,例如名字或姓氏或全名。我目前有以下查询:

await query
         .Where(p => p.Forename != null && p.Forename.ToLower().Contains(filter) ||
                     p.Surname != null && p.Surname.ToLower().Contains(filter))
         .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

这显然只单独检查名字/姓氏列。如果过滤器是全名,则不起作用。

我尝试在 where 子句中进行字符串插值,以针对名字和姓氏的组合应用 contains 过滤器,但它在 ef 核心中不受支持并在本地执行。由于数据库中有超过一百万的患者,因此在应用程序中本地执行查询不是一种选择,必须在数据库中完成(搜索需要一分钟以上)。

有没有办法解决这个问题?

Cod*_*und 5

EF 无法翻译插值。

只需使用“+”运算符连接如下字符串:

await query
     .Where(p => p.Forename.ToLower().Contains(filter) ||
                 p.Surname.ToLower().Contains(filter)) || 
                 (p.Forename + " " + p.Surname).ToLower().Contains(filter))
     .ToListAsync();
Run Code Online (Sandbox Code Playgroud)