Динамический Linq для добавления LIKE в предложение where

Я пытаюсь выполнить предложение LIKE в запросе сущности. В примерах, которые я видел, использовался динамический linq для делать такие вещи, но мой код ...

var query = context.StudySet
    .Where("it.PatientName LIKE @patientName", new ObjectParameter("patientName", patientName);

... дает мне System.Linq.Dynamic.ParseException с

Additional information: Expression of type 'Boolean' expected

context - это DbContext из EF 6, код сначала, имя пациента - это строка

Подскажите пожалуйста, что не так с моим кодом?


person nopskazoid    schedule 09.05.2014    source источник
comment
Разве у вас не сработало бы что-то вроде var query = context.StudySet.Where((it) => it.PatientName.Contains(patientName)) без использования Dynamic LINQ?   -  person Mark    schedule 09.05.2014
comment
Значение имя пациента будет получено из поля поиска, которое будет принимать подстановочные знаки. Думаю, я могу разделить строку и создать запрос, объединяющий StartsWith, Contains, EndsWith и т. Д. Я просто увидел LIKE как немного меньший код.   -  person nopskazoid    schedule 09.05.2014
comment
В этом есть смысл, разделение - это не весело! Может быть, SqlMethods.Like сработает, как в этот ответ? Просто не уверен, что он работает с EF.   -  person Mark    schedule 09.05.2014
comment
Нет, верно, не работает, только Linq to SQL, к сожалению.   -  person nopskazoid    schedule 09.05.2014
comment
Извините - я думаю, я иду по пути, который вы уже прошли! Как насчет использования SqlQuery и необработанного SQL, например, var query = context.StudySet.SqlQuery("select * from StudySet where PatientName LIKE @patientName", new SqlParameter("@patientName", patientName));?   -  person Mark    schedule 10.05.2014
comment
Да, это сработает. Спасибо, Марк.   -  person nopskazoid    schedule 10.05.2014
comment
Вы пробовали var query = context.StudySet.Where(s => s.PatientName.Contains(userInput)) - я понимаю, что это не Dynamic Linq, но если вы жестко кодируете имя своей таблицы в строке, это будет то же самое.   -  person Nate    schedule 10.05.2014


Ответы (3)


если вы хотите использовать DynamicLINQ, вам нужно изменить свой код следующим образом

var query = context.StudySet.Where("it.PatientName.Contains(@0)", patientName);

потому что DynamicLinq не может анализировать оператор LIKE

person Grundy    schedule 10.05.2014
comment
LIKE должен поддерживаться. Мне не нужно использовать Dynamic Linq, я хочу сделать НРАВИТСЯ. Содержит! = LIKE (см. Выше). - person nopskazoid; 12.05.2014
comment
@nopskazoid eSQL не тот же DynamicLINQ :-), возможно, вам нужно изменить теги для вопроса - person Grundy; 12.05.2014

Я осознал свою ошибку.

Я предполагал, что метод передачи запроса является частью Dynamic Linq, но на самом деле это всего лишь вариант стандартного метода Where в ObjectQuery. Если я получу ObjectContext из моего (сначала кода) DbContext, все будет хорошо.

ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
ObjectSet<Study> studySet = objectContext.CreateObjectSet<Study>();

var query = studySet.
    Where("it.PatientName LIKE @patientName", new ObjectParameter("patientName", patientName));
person nopskazoid    schedule 12.05.2014
comment
Это мощный и гибкий. Спасибо. - person Thomas.Benz; 15.01.2016

Я не знаю, как использовать это с запросом LINQ, но вы можете использовать необработанный запрос SQL:

var query = context.StudySet.SqlQuery(
    "select * from StudySet where PatientName LIKE @patientName",
    new SqlParameter("@patientName", patientName));
person Mark    schedule 09.05.2014