[英]EF Core freetext with child entity
EF Core 2.1 添加了对FREETEXT
支持,如如何在 EF core 2.1 中使用 FreeText 中所述。 但是,我在使用 EF Core 2.2 时遇到了一个不同的问题:EF Core 的FREETEXT
是否支持子实体?
public class Customer
{
public Name Name { get; set; }
public List<Address> Addresses { get; set; }
}
Name 是一个拥有的实体(值对象),非常适合搜索:
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
地址是一个子实体:
public class Address
{
public string Street { get; set; }
public string Number { get; set; }
}
此搜索工作正常:
query.Where(c => EF.Functions.Freetext(c.Name.FirstName, searchTerm) || EF.Functions.Freetext(c.Name.LastName, searchTerm)
此搜索不会,因为最终术语无法转换为 SQL:
query.Where(c => EF.Functions.Freetext(c.Name.FirstName, searchTerm) || EF.Functions.Freetext(c.Name.LastName, searchTerm) || EF.Functions.Freetext(c.Addresses.First().Street, searchTerm)
有什么办法可以解决这个问题,还是我需要使用 SQL 函数? 我曾尝试使用Select()
语句,但也无法完全转换为 SQL。
找到了! 显然, EF.Functions.FreeText(c.Addresses.First().Street, searchTerm)
不能在客户端进行评估。 但是,这可以:
EF.Functions.FreeText(c.Addresses.Any(a => EF.Functions.FreeText(a.Street, searchTerm))
因此,请确保EF.Functions.FreeText()
接收一个简单的string
作为其第一个属性,并使用任何其他 LINQ 来选择子实体的First()
、 'Last()' 、 Any()
和All()
。
EF Core 2.1 中 FREETEXT 方法的文档表明不允许客户端评估。 目前还没有 EF Core 2.2 的文档,但我认为它没有改变。
这个 DbFunction 方法没有内存中的实现,如果查询切换到客户端评估将抛出。
如果查询包含一个或多个无法转换为存储的表达式,就会发生这种情况。
否则,您可以考虑在 Customer 上添加一个属性,您可以直接查询该属性,如果使用 FREETEXT 对您来说真的很重要。 例如
public class Customer
{
public Name Name { get; set; }
public List<Address> Address { get; set; }
public string DefaultStreet { get; set; }
}
根据您的查询,我假设地址在列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.