Лямбда-выражения и хранимые процедуры - PullRequest
4 голосов
/ 18 мая 2010

Я пытаюсь имитировать метод расширения LINQ Where для моих методов ADO.NET DAL.

По сути, моя цель - создать единственный метод, который я могу вызвать. Такие как:

Product p = Dal.GetProduct(x => x.ProductId == 32);
Product p2 = Dal.GetProduct(x => x.ProductName.Contains("Soap"));

Затем я хочу проанализировать эти предикаты и отправить параметры фильтра параметрам в вызове хранимой процедуры ADO.NET.

Любые комментарии с благодарностью.

Ответы [ 2 ]

9 голосов
/ 18 мая 2010

Как указывает @Daniel, это далеко не просто. Схема решения состоит в том, чтобы позволить GetProduct принимать аргумент типа Expression<Func<Product, bool>>. Затем вам нужно пройти по дереву синтаксического анализа этого выражения, сгенерировав правильный SQL для известных функций, а также решить, как обрабатывать неизвестные функции. Для этого есть два основных варианта:

  1. Выдает ошибку (как делает linq-to-sql).
  2. Пропустите его в переводе, а затем примените его к возвращенному результату. Влияние на производительность, конечно, может быть огромным, если большая часть данных извлекается только для того, чтобы отфильтровать.

Это было бы забавное упражнение, но я вряд ли смогу найти способ оправдать его в реальном мире, когда уже есть linq2sql, linq2entities и linq2NHibernate, которые делают эту работу.

4 голосов
/ 18 мая 2010

В дополнение к ответу Андерса я просто хочу упомянуть, что вы можете анализировать дерево выражений с помощью посетителя выражений. Для этого вы можете унаследовать класс ExpressionVisitor (он новый в .NET 4, но вы можете найти реализацию 3.5 в LinqKit ) и переопределить методы, которые хотите проанализировать каждый узел.

Вам также могут быть интересны эти ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...