Как использовать функцию разницы в EntityFrameworkCore? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть этот запрос, который нужно выполнить:

Select * From Products WHERE Title like '%search text%' 
ORDER BY Difference(Title, 'search text') DESC

Теперь я хочу реализовать вышеупомянутый запрос, используя EntityFrameworkCore и linq .

Так как я могу вызвать функцию разницы для заказа товаров по ближайшему совпадению в столбце заголовка?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Каждый IQueryable содержит Expression и Provider.Expression содержит запрос, который должен быть выполнен.Provider знает, кто должен выполнить запрос, обычно это система управления базами данных.Задачей Provider является перевод Expression на язык, который понимает база данных (что-то вроде SQL), и выполнение запроса.Provider будет эффективно извлекать результаты и возвращать запрошенные данные как перечисляемый объект.

IQueryable реализует IEnumerable.

Когда вы используете функции LINQ, такие как ToList(), FirstOrDefault(), Any() или используйте запрос в foreach, затем вызывается внутренне IEnumerable.GetEnumerator() и Enumerator.MoveNext()

Это прикажет Provider преобразовать Expression в SQL и выполнить запрос.Возвращенное перечисление используется для перечисления по возвращаемым элементам.

Задача программиста класса, реализующего IQueryable, реализовать преобразование Expression в SQL.Это нелегко, и я думаю, что люди, создавшие Entity Framework, проделали большую работу.

Однако некоторые элементы, известные в SQL, очень сложно реализовать.Среди них понятия SoundEx и Difference.Я не уверен, но я думаю, что одна из причин, которые затрудняют это, заключается в том, что они обычно используются в SQL, а не в любых других системах IQueryable.

На самом деле, естьнесколько функций, которые не поддерживаются структурой объекта.См. Поддерживаемые и неподдерживаемые методы LINQ (LINQ для сущностей) .

Ваш DbContext является абстрактным представлением модели вашей базы данных.Пользователям его не должно волновать, использует ли он Microsoft SQL, MySQL, или же это сбор данных, который не использует ничего похожего на SQL.

Но если вы абсолютно уверены, что можно ограничить вашDbContext только для определенных типов баз данных, которые знают понятия SoundEx и Difference, рассмотрите возможность создания хранимой процедуры для вашего запроса.См. Как вызвать хранимую процедуру в Entity Framework

0 голосов
/ 16 октября 2018

SQL не может понять функцию Difference, написанную на c #.Чтобы это работало, вам нужно будет выбрать значения из таблицы «Продукты» в c# collection like List

. Затем выполнить заказ в этом списке, используя функцию Difference

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...