В EF Core 2.1 добавлена поддержка FREETEXT
, о чем также говорилось в Как использовать FreeText в ядре EF 2.1. Однако у меня возникла другая проблема при использовании EF Core 2.2: поддерживает ли EF Core 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.
В документации по методу FREETEXT из EF Core 2.1 указано, что оценка клиента не разрешена. Документов для 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; }
}
Я предполагаю, что адреса находятся в списке, основанном на вашем запросе.
Спасибо за вашу помощь! Согласен, оценка клиента невозможна с FREETEXT
, я заметил. Но есть ли способ добавить предложение WHERE
к дочерней сущности и НЕ вернуться к оценке клиента? (И да, Addresses
на List
, извините!)
Нашел! По-видимому, 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()
дочерних сущностей.
Извините, Address должен был быть
List
изAddress
объектов. Так что это первыйAddress
в списке. Я отредактировал вопрос.