2012-05-01 3 views
3

Я использую Linq для Entities и добавил использование stmt из using System.Linq.Dynamic; Моя цель - передать переменную whereClause в запрос emailList (см. Снимок экрана).с использованием переменных в динамическом запросе linq

Любые мысли?

Error message details

+++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++
После использования @Michael предложения я получил его на работу со следующим:

HTML (уведомления я поместил значение поля в «Value 'атр). за

<asp:CheckBoxList ID="_checkboxGroups" runat="Server"> 
          <asp:ListItem Text="Sid Dickens Lovers" Value="SidDickens_TF" Selected="False" /> 
          <asp:ListItem Text="Rosamond Lover" Value="Rosamond_TF" Selected="false" /> 
          <asp:ListItem Text="Wine and Cheese Lovers" Value="WineAndCheese_TF" Selected="false" /> 
          <asp:ListItem Text="Good Clients" Value="IntDesign_TF" Selected="false" /> 
          <asp:ListItem Text="Vendors" Value="Vendor_TF" Selected="false" /> 
         </asp:CheckBoxList> 

Код:

// determine # of items in asp:CheckBoxList 
     var groupCount = _checkboxGroups.Items.Count; 

     var conditions = new List<string>(); 

     for (int i = 0; i < groupCount; i++) 
     { 
      if (_checkboxGroups.Items[i].Selected) 
      { 
       conditions.Add(_checkboxGroups.Items[i].Value.ToString() + " == true"); 
      } 
     } 

     string whereClause = string.Join(" OR ", conditions.ToArray()); 


     ElanEntities3 db = new ElanEntities3(); 

     var emailList = (from c in db.vEmailListViewforSendings 
         orderby c.Email 
         select c).AsQueryable(); 

     emailList = emailList.Where(whereClause); 

     _listViewClients.DataSource = emailList; 

ответ

0

используется System.Linq.Dynamic http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

var email = from c in db.MailListViewForSendings 
      order by c.ID 
      select c; 

// then you chain the Linq; 
email = email.Where("CategoryID=3"); 

Чтобы использовать параметры:

var email = from c in db.MailListViewForSendings 
      order by c.ID 
      select c; 

// then you chain the Linq; 
email = email.Where("[email protected]", 3); 

UPDATE

Не использовать StringBuilder, используйте вместо List<string>, затем сцепить его by string.Join:

using System; 

using System.Collections.Generic; 

public class Test 
{ 
     public static void Main() 
     { 
      var conditions = new List<string>(); 
      conditions.Add("Lastname = 'Lennon'"); 
      conditions.Add("Firstname = 'John'"); 
      conditions.Add("Age = 40"); 

      Console.WriteLine(string.Join(" OR ", conditions.ToArray())); 
     } 
} 

Выход:

Lastname = 'Lennon' OR Firstname = 'John' OR Age = 40 

Живой тест: http://ideone.com/EFhnA

+0

, учитывая, что я не знаю, что будут выбраны многие элементы «_checkBoxGroup», я не понимаю, как сгруппировать «OR» в динамическом режиме? – blub

+0

Я отредактировал свой ответ –

+0

Спасибо за вашу помощь ... см. Мои комментарии в моих исправлениях к исходному сообщению. – blub

1

Вы должны быть в состоянии сделать это с помощью Linq Dynamic Query:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Это то, что библиотека была разработана для.

+0

Я уже добавил заявление System.Linq.Dynamic, моя проблема правильно использует динамическую библиотеку. Неправильно ли мое форматирование? – blub

+0

Попробуйте переключиться с синтаксиса стиля Linq на синтаксис метода расширения: 'db.vEmailList.Where (whereClause.ToString()) .OrderBy (c => c.ID)'. Это должно помочь. –

2

Вам нужно передать объект, соответствующий параметр IQueryable.Where(predicate)

Так whereClause должен быть объектом такого типа:

Expression<Func<TSource, bool>> 

Поскольку вы обращаетесь к своим предложениям, не содержащим их, вам нужно будет создать одно предложение большого места.

Если предположить, что объект данных имеет тип OBJ и имеет BOOL свойства P0 и P1:

bool filterP0 = _checkboxGroups[0].Selected; 
bool filterP1 = _checkboxGroups[1].Selected; 

Expression<Func<OBJ, bool>> predicate = o => 
(
    (!filterP0 && !filterP1) 
    || 
    (filterP0 && o.P0) 
    || 
    (filterP1 && o.P1) 
); 

var emailList = 
    db.vEmailListViewForSendings 
     .Where(predicate) 
     .OrderBy(o => o.ID); 

Это суть в любом случае.


Или, если вы действительно должны построить предикат динамически, можно использовать Joe Albahari's Predicate Builder.

+0

В приведенном выше примере кода вы правы. Однако аргументы строки могут быть переданы в версии метода расширения Where() в IQueryable, которые используют динамический LINQ. См. Ответ Виктора Зычлы. – Slavo

+2

@Slavo Если нет абсолютно другого пути, я бы избегал использовать магические струны. Если бы не было другого способа, я бы этого не сделал. Магические строки непрозрачны для компилятора и вызывают исключения во время выполнения. –

+0

Согласен, но это еще одна тема. Вопрос только спрашивает как. – Slavo

Смежные вопросы