Entity Framework 4: преобразовать строковое условие в лямбда-выражение? - PullRequest
8 голосов
/ 02 мая 2011

Я хочу принять строковый массив, где условия от клиента, как field == value. Было бы неплохо создать объект спецификации, который мог бы принять строку в конструкторе и вывести лямбда-выражение для представления предложения Where. Например, я мог бы сделать следующее:

var myCondition = new Specification<Product>( myStringArrayOfConditions); 
var myProducts = DB.Products.Where( myCondition);

Как вы можете превратить "name == Jujyfruits" в
DB.Products.Where(p => p.name == "JujyFruits")?

Ответы [ 3 ]

14 голосов
/ 02 мая 2011

Вы можете использовать

  • Отражение для получения свойства Product.name из строки name и
  • класс LINQ Expression для ручного создания лямбда-выражения.

Обратите внимание, что следующий пример кода будет работать только для операций Equals (==). Однако его легко обобщить и на другие операции (разбить на пробел, проанализировать оператор и выбрать соответствующее выражение вместо Expression.Equal).

    var condition = "name == Jujyfruits";

    // Parse the condition
    var c = condition.Split(new string[] { "==" }, StringSplitOptions.None);
    var propertyName = c[0].Trim();
    var value = c[1].Trim();

    // Create the lambda
    var arg = Expression.Parameter(typeof(Product), "p");
    var property = typeof(Product).GetProperty(propertyName);
    var comparison = Expression.Equal(
        Expression.MakeMemberAccess(arg, property),
        Expression.Constant(value));
    var lambda = Expression.Lambda<Func<Product, bool>>(comparison, arg).Compile();

    // Test
    var prod1 = new Product() { name = "Test" };
    var prod2 = new Product() { name = "Jujyfruits" };
    Console.WriteLine(lambda(prod1));  // outputs False
    Console.WriteLine(lambda(prod2));  // outputs True

О конструкторе: поскольку Func<T, TResult> запечатан, вы не можете извлечь из него. Однако вы можете создать оператор неявного преобразования , который переводит Specification<T> в Func<T, bool>.

3 голосов
/ 02 мая 2011

Недавно мы обнаружили библиотеку Dynamic LINQ из примеров проектов VS2008.Прекрасно работает, чтобы превратить предложения "Where" на основе строк в выражения.

Эта ссылка приведет вас туда.

0 голосов
/ 02 мая 2011

Вам нужно превратить поисковый запрос в предикат. Попробуйте что-то вроде следующего:

string searchString = "JujyFruits";
Func<Product, bool> search = new Func<Product,bool>(p => p.name == searchString);

return DB.Products.Where(search);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...