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

EF Core freetext with child entity

EF Core 2.1 添加了对 FREETEXT 的支持,如 中所述。但是,我有一个不同的问题,使用 EF Core 2.2:Does EF Core's FREETEXT support child entities?

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.

来自 EF Core 2.1 的 FREETEXT 方法的文档表明不允许客户端评估。目前还没有 EF Core 2.2 的文档,但我认为它没有改变。

This DbFunction method has no in-memory implementation and will throw if the query switches to client-evaluation.

This can happen if the query contains one or more expressions that could not be translated to the store.

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

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

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

根据您的查询,我假设地址在列表中。

找到了!显然, 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() 个子实体。