繁体   English   中英

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

[英]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 方法没有内存中的实现,如果查询切换到客户端评估将抛出。

如果查询包含一个或多个无法转换为存储的表达式,就会发生这种情况。

请参阅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; }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM