假设实体Patient
存在于上下文中,该实体是使用数据库优先方法生成的,因此我无法修改数据库。
public class Patient
{
public string Id { get; set; }
public string Surname { get; set; }
public string Forename { get; set; }
}
我想按姓名过滤患者,例如名字或姓氏或全名。我目前有以下查询:
await query
.Where(p => p.Forename != null && p.Forename.ToLower().Contains(filter) ||
p.Surname != null && p.Surname.ToLower().Contains(filter))
.ToListAsync();
这显然只能单独检查forename / surname列。如果过滤器是全名,则不起作用。
我在where子句中尝试了字符串插值,以对包含forename和surname的组合应用包含过滤器,但在ef核心中不支持它并在本地执行。由于数据库中有超过一百万患者,因此在应用程序中本地执行查询不是一种选择,必须在数据库中完成(搜索需要一分钟)。
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
插值无法由EF翻译。
只需使用' +'运算符连接如下所示的字符串:
await query
.Where(p => p.Forename.ToLower().Contains(filter) ||
p.Surname.ToLower().Contains(filter)) ||
(p.Forename + " " + p.Surname).ToLower().Contains(filter))
.ToListAsync();