Создать запрос LINQ из нескольких элементов управления - PullRequest
1 голос
/ 17 сентября 2008

Я недавно написал приложение (vb.net), которое хранит и позволяет искать старые планы совета. Теперь, когда приложение работает хорошо, на днях я изучал подпрограмму, которую я использую для генерации строки SQL для передачи базы данных, и, честно говоря, это было плохо.
Я просто разместил здесь вопрос, чтобы узнать, есть ли у кого-нибудь еще лучший способ сделать это.

У меня есть форма с набором элементов управления, от текстовых полей до переключателей, каждый из которых похож на фильтры базы данных, а когда пользователь нажимает кнопку поиска, строку SQL (мне бы очень хотелось, чтобы Запрос LINQ, потому что я перешел на LINQ to SQL), генерируется из завершенных элементов управления и запускается.

Проблема, с которой я столкнулся, заключается в сопоставлении каждого из этих элементов управления с полем в базе данных и создании запроса LINQ эффективно, не выполняя кучу «если ... тогда ... еще». заявления. В прошлом я только использовал свойство тега в элементе управления, чтобы связать его с именем поля в базе данных.

Извините, если это немного сбивает с толку, это сложно описать. Просто выбросить его, чтобы узнать, есть ли у кого-нибудь идеи.

Спасибо Nathan

Ответы [ 7 ]

0 голосов
/ 17 сентября 2008

Я не против метода sfusco с использованием атрибутов. Единственная вещь, в которой я не уверен, это где прикреплять атрибуты, потому что, если я присоединяю то к объявлению элементов управления, которое находится в коде конструктора, оно будет восстановлено при изменении формы.

Или я совершенно не понимаю методы sfusco?

0 голосов
/ 17 сентября 2008

Я думаю, что, возможно, правильным способом сделать это будет поставщик расширений: Документация MSDN

Затем вы можете использовать редактор, чтобы предоставить имена полей для подключения, и вашему поставщику расширителя можно передать IQueryable , добавить критерии и вернуть IQueryable .

0 голосов
/ 17 сентября 2008

Я думаю, вы ищете, как создать «динамический» запрос Linq, Здесь - пример того, как сделать это с библиотекой методов расширения. Эти методы принимают строковые аргументы вместо типобезопасных языковых операторов.

0 голосов
/ 17 сентября 2008

Я не уверен на 100%, как этого добиться, но я знаю, с чего начать в источнике ASP.NET MVC. В последних версиях он способен принимать ответ формы и передавать его во вспомогательный метод, который выполняет запись в источник данных LINQ.

Я считаю, что MVC - это C #, поэтому, если вы ищете перевод VB, вы можете попробовать использовать .NET Reflector и преобразовать его обратно в VB.

0 голосов
/ 17 сентября 2008

Я не знаю о производительности здесь, но если вы установите класс контекста данных LINQ to SQL, вы сможете запросить таблицу базы данных с помощью .Select (...) или .Where (... ). Вы должны быть в состоянии построить лямбда-выражения для любого из них динамически. Вы можете посмотреть динамическое создание лямбда-выражений для этих целей. Я сделал все до момента генерации динамической лямбды, но это возможно.

0 голосов
/ 17 сентября 2008

При программировании сложных специальных типов запросов, атрибуты могут быть вашим лучшим другом. Возьмите более декларативный подход и украсьте ваши классы, интерфейсы и / или свойства некоторыми пользовательскими атрибутами, а затем напишите некоторый универсальный «склеивающий» код, который связывает ваш интерфейс с вашей моделью. Это позволит вашей модели и презентации быть гибкими, без необходимости изменять тысячи строк логики контроллера. На самом деле, именно так Microsoft создает страницу Visual Studio «Свойства». Вы даже можете использовать Microsoft EnvDTE.dll в своем продукте в зависимости от требований.

0 голосов
/ 17 сентября 2008

Вы можете обернуть каждый элемент управления в пользовательский элемент управления, который может принять IQueryable и привязать к запросу, если это оправдано.

Таким образом, код вашей страницы может выглядеть примерно так:

var qry = from t in _db.TableName
      select t;

затем передайте qry методу на каждом пользовательском элементе управления

IQueryable<t> addToQueryIfNeeded(IQueryable<t> qry)
{
   if(should be added)
      return from t in qry
           where this == that
           select t;
   else
      return qry
}

тогда после того, как вы пройдете каждый элемент управления, ваш запрос будет завершен, и тогда вы сможете .ToList () его. Крутая вещь в LINQ - ничего не произойдет, пока вы .ToList () или .First () не сделаете.

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