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 не имеет реализации в памяти и будет выдавать, если запрос переключается на оценку клиента.

Это может произойти, если запрос содержит одно или несколько выражений, которые невозможно перевести в хранилище.

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

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

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