Произвольный текст EF Core с дочерней сущностью

В 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.

Извините, Address должен был быть List из Address объектов. Так что это первый Address в списке. Я отредактировал вопрос.

Rogier van het Schip 10.04.2019 06:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 082
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В документации по методу 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.

См. 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; }
}

Я предполагаю, что адреса находятся в списке, основанном на вашем запросе.

Спасибо за вашу помощь! Согласен, оценка клиента невозможна с FREETEXT, я заметил. Но есть ли способ добавить предложение WHERE к дочерней сущности и НЕ вернуться к оценке клиента? (И да, Addresses на List, извините!)

Rogier van het Schip 10.04.2019 06:41
Ответ принят как подходящий

Нашел! По-видимому, 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() дочерних сущностей.

Другие вопросы по теме