Как создать запрос LINQ из строки?

Я новичок в 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. Однако это явно не сработает. Поэтому может ли кто-нибудь помочь мне в этом?

Ответ 1

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

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

  • Непосредственно выполнять 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
    }
    

Ответ 2

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

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

Ответ 4

Большая часть причин, по которым вы используете LINQ, в первую очередь, заключается в получении запросов, проверенных с помощью компилятора, которые wil ldetect ошибок во время компиляции. Это приведет к поражению этой цели, поскольку строка будет проанализирована во время выполнения.

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

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

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

Ответ 5

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

Ответ 6

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

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