EF Core свободный текст с дочерней сущностью - PullRequest
0 голосов
/ 09 апреля 2019

В EF Core 2.1 добавлена ​​поддержка FREETEXT, о чем также говорилось в Как использовать FreeText в EF core 2.1 .Однако у меня другая проблема с использованием EF Core 2.2: FREETEXT EF Core * поддерживает дочерние объекты?

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 ]

1 голос
/ 10 апреля 2019

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

0 голосов
/ 09 апреля 2019

Документы для метода 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

В противном случае, вы можете рассмотреть возможность добавления свойствана клиента, по которому вы можете запросить напрямую, если для вас действительно важно использовать FREETEXT.Например,

public class Customer
{
    public Name Name { get; set; }
    public List<Address> Address { get; set; }
    public string DefaultStreet { get; set; }
}

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

...