ef core 2.0 使用包含过滤器搜索多列
ef core 2.0 search multiple columns with contains filter
假设实体,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 子句中进行字符串插值以针对名字和姓氏的组合应用 contains 过滤器,但它在 ef core 中不受支持并且在本地执行。由于数据库中有超过一百万的患者,因此无法在应用程序中本地执行查询,而必须在数据库中完成(搜索需要一分钟多的时间)。
有什么办法可以解决吗?
EF 无法翻译插值。
只需使用“+”运算符连接字符串,如下所示:
await query
.Where(p => p.Forename.ToLower().Contains(filter) ||
p.Surname.ToLower().Contains(filter)) ||
(p.Forename + " " + p.Surname).ToLower().Contains(filter))
.ToListAsync();
假设实体,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 子句中进行字符串插值以针对名字和姓氏的组合应用 contains 过滤器,但它在 ef core 中不受支持并且在本地执行。由于数据库中有超过一百万的患者,因此无法在应用程序中本地执行查询,而必须在数据库中完成(搜索需要一分钟多的时间)。
有什么办法可以解决吗?
EF 无法翻译插值。
只需使用“+”运算符连接字符串,如下所示:
await query
.Where(p => p.Forename.ToLower().Contains(filter) ||
p.Surname.ToLower().Contains(filter)) ||
(p.Forename + " " + p.Surname).ToLower().Contains(filter))
.ToListAsync();