EF Core 2.1添加了对FREETEXT
的支持,这也在How to use FreeText in EF core 2.1中进行了讨论。但是,使用EF Core 2.2存在另一个问题:EF Core的FREETEXT
是否支持子实体?
public class Customer
{
public Name Name { get; set; }
public List<Address> Addresses { get; set; }
}
名称是一个拥有的实体(值对象),非常适合搜索:
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。
答案 0 :(得分:1)
找到了!显然,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()
个子实体。
答案 1 :(得分:0)
来自EF Core 2.1的FREETEXT方法的文档指示不允许进行客户端评估。 EF Core 2.2尚无文档,但我认为它没有更改。
此DbFunction方法没有内存实现,如果查询切换到客户端评估,则会抛出该异常。
如果查询包含一个或多个无法翻译到商店的表达式,则会发生这种情况。
否则,如果对使用FREETEXT确实很重要,则可以考虑在Customer上添加一个属性,可以直接在该属性上查询。例如
public class Customer
{
public Name Name { get; set; }
public List<Address> Address { get; set; }
public string DefaultStreet { get; set; }
}
根据您的查询,我认为地址在列表中。