Как создать LINQ Query из строки? - PullRequest
11 голосов
/ 28 февраля 2011

Я новичок в LINQ, и мне действительно нужна помощь с кодированием.

На данный момент у меня есть строка и переменная var.

string temp = "from product in myEntities.Products where product.Name.Contains(_Name) select product";
var _Products = temp;
LvProducts.DataSource = _Products;
LvProducts.DataBind();

По сути, я хочу создать собственный / сложный запрос LINQ, предварительно назначив его в строку. После того, как я закончил с компоновкой, я назначил строку в переменную var. Однако это, очевидно, не сработает. Поэтому, может ли кто-нибудь помочь мне в этом?

Ответы [ 6 ]

18 голосов
/ 28 февраля 2011

У вас есть несколько вариантов:

  • Используйте библиотеки Dynamic Linq для создания ваших запросов на лету.Лучшее место для начала - прочитать запись в блоге ScottGu .Тем не менее, я не думаю, что эти библиотеки поддерживают метод contains в вашем примере. Здесь - сообщение в блоге, объясняющее, как добавить эту поддержку.

  • Непосредственно выполнение операторов SQL .Просмотрите документы MSDN для Linq to Sql или Linq to Entities .

    var _Products = myEntities.ExecuteStoreQuery<Product>
    (@"SELECT * FROM Products WHERE [Name] In ('Item1', 'Item2')");
    
  • Использование Составное поведение Linq .Возможно, это не самое элегантное решение, но оно работает очень хорошо, если у вас не слишком много вариантов.Вы можете просто построить свой запрос из нескольких частей.

    var _Products = from product in myEntities.Products
                    select product
    
    _Products = from product in _Products 
                where product.Name.Contains(_Name)
                select product
    
    if FilterByPrice {
        _Products = from product in _Products 
                    where product.Price > 100 
                    select product
    }
    
8 голосов
/ 28 февраля 2011

Вы можете сделать это, скомпилировав этот Linq в некотором c #, используя CodeDomProvider - Добавление функций сценариев в приложения .NET - но это довольно тяжеловесное решение. Если вы хотите узнать больше о том, как это сделать, взгляните на LinqPad - http://www.linqpad.net - автор предлагает вам использовать декомпилятор, чтобы увидеть, как он работает!

Если требование сводится к простому условию, в котором возможно использование Dynamic Linq - см. Сообщения Скотта Гу и образец кода от Microsoft - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

3 голосов
/ 28 февраля 2011

Может быть, это может помочь вам http://nlinq.codeplex.com/

BR.

0 голосов
/ 28 февраля 2011

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

0 голосов
/ 28 февраля 2011

Во многом причина того, что вы в первую очередь используете LINQ, заключается в том, чтобы получать проверенные компилятором запросы, которые будут обнаруживать ошибки во время компиляции.Это побьет эту цель, поскольку строка будет проанализирована во время выполнения.

Для ваших нужд у вас есть два варианта:

1) Создание запроса eSQL и запуск его в ObjectContext.Используя это, вы все равно можете использовать свои объекты, такие как myEntities.Products, и возвращать список продуктов.

2) Используя обычный запрос SQL, и используйте ObjectContext, чтобы вызвать его непосредственно к базовой базе данных.

0 голосов
/ 28 февраля 2011

вы думаете о нем как о динамическом SQL, где вы создаете инструкцию как строку и анализируете ее как инструкцию SQL.

Поскольку вы уже в коде, почему бы не сделать утверждения прямо там. Было бы намного проще, если бы вы использовали Lambda вместо традиционного linq. мои 2 цента.

...