带有子实体的 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.
否则,您可以考虑在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()
个子实体。
EF Core 2.1 添加了对 FREETEXT
的支持,如 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.
否则,您可以考虑在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()
个子实体。