2016-08-24 3 views
3

Я пытаюсь использовать динамический linq для получения подмножества людей из базы данных с использованием Entity Framework (EF). При использовании операции contains у меня возникает проблема. Вот сущность для людей таблицы:Ошибка при запросе на подстроку с использованием динамического Linq

public class Person 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string ZipCode { get; set; } 
} 

Вот запрос, который успешно работает.

var people = personContext 
    .People 
    .OrderBy("id asc") 
    .Skip(0) 
    .Take(5) 
    .ToList(); 

Обратите внимание, что я использую динамический linq в методе OrderBy. Однако, когда я пытаюсь применить фильтрацию , я получаю исключение.

var people = personContext 
    .People 
    .Where("id.Contains(15)") 
    .OrderBy("id asc") 
    .Skip(0) 
    .Take(5) 
    .ToList(); 

То, что я хотел бы получить обратно подмножество людей с идентификаторами, которые содержат подстроку «15», например:

"015", "115", "151", "152", etc. 

Когда я выполнить код, я получаю следующее ошибка.

System.Linq.Dynamic.ParseException was unhandled by user code 
    Message=No applicable method 'Contains' exists in type 'String' 

Каков синтаксис определения, содержит ли поле ИД строку «15»?

ответ

2

Каков синтаксис для определения, содержит ли поле Id строку «15»?

Ну, безусловно, не .Where("id.Contains(15)"), который пытается вызвать метод Contains с числовым значением 15.

Согласно documentation, вы можете использовать либо строкового литерала:

.Where("id.Contains(\"15\")") 

или substitution values:

.Where("id.Contains(@0)", "15") 
+0

Мне не хватало цитат! Поскольку я сравниваю строки, нужны цитаты. Хорошо поймал! – Halcyon

0

Вы не можете использовать Содержит в запросе LINQ. Вместо этого вы можете попробовать это

var people = (from p in personContext.Set<People>() 
    where p.Id.Contains("15") 
    orderby p.Id 
    select p).Skip(0).Take(5).ToList(); 
2

Я чувствую, что здесь неправильное представление ... Вы не должны использовать LINQ, как это. В начале вам нужно вызвать перегрузки, которые принимают лямбды; то вы указываете свойство в лямбда и если его строка вы вызываете Contains. Как так:

var people = personContext 
    .People 
    .Where(p => p.Id.Contains("15")) 
    .OrderByDescending(p => p.Id) 
    .Skip(0) // You don't need this line. 
    .Take(5) 
    .ToList(); 

Сам EF будет делать тяжелую работу и перевести эту чистую C# коды в соответствующие заявления SQL.

Смежные вопросы