1

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。

4

2 回答 2

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()接收一个 simplestring作为其第一个属性,并使用任何其他 LINQ 来选择子实体First()、“Last()”Any()All()子实体。

于 2019-04-10T06:35:33.790 回答
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; }
}

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

于 2019-04-09T15:05:10.113 回答