EF Core свободный текст с дочерней сущностью
В EF Core 2.1 добавлена поддержка FREETEXT
Как также обсуждалось в разделе Как использовать FreeText в ядре EF 2.1. Однако у меня другая проблема с использованием EF Core 2.2: 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 ответа
Нашел это! По-видимому, 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()
, 'Прошлой()', Any()
а также All()
дочерних образований.
Документы для метода FREETEXT из EF Core 2.1 указывают, что оценка клиента не допускается. Документов для EF Core 2.2 пока нет, но я полагаю, что это не изменилось.
Этот метод DbFunction не имеет реализации в памяти и будет выдавать, если запрос переключается на оценку клиента.
Это может произойти, если запрос содержит одно или несколько выражений, которые невозможно перевести в хранилище.
В противном случае вы можете рассмотреть возможность добавления свойства в Customer, по которому вы можете запросить напрямую, если для вас действительно важно использовать FREETEXT. Например
public class Customer
{
public Name Name { get; set; }
public List<Address> Address { get; set; }
public string DefaultStreet { get; set; }
}
Я предполагаю, что адреса находятся в списке на основе вашего запроса.