带有子实体的EF Core自由文本

时间:2019-04-09 14:22:23

标签: c# entity-framework entity-framework-core freetext entity-framework-core-2.2

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。

2 个答案:

答案 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方法没有内存实现,如果查询切换到客户端评估,则会抛出该异常。

     

如果查询包含一个或多个无法翻译到商店的表达式,则会发生这种情况。

请参见https://docs.microsoft.com/en-us/dotnet/api/microsoft.entityframeworkcore.sqlserverdbfunctionsextensions.freetext?view=efcore-2.1

否则,如果对使用FREETEXT确实很重要,则可以考虑在Customer上添加一个属性,可以直接在该属性上查询。例如

public class Customer
{
    public Name Name { get; set; }
    public List<Address> Address { get; set; }
    public string DefaultStreet { get; set; }
}

根据您的查询,我认为地址在列表中。