2010-08-17 4 views
1

Все еще действительно борются с этим и, кажется, кружатся по кругу.Dynamic LINQ Multiple Where Section

У меня есть следующий код, который меня заводит. Он должен заполнить список элементов, которые будут использоваться в текстовом поле автозаполнения:

public string[] GetAutoComplete(string prefixText, int count) 
    { 
      string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
      string locationid = HttpContext.Current.Session["LocationID"].ToString(); 
      string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
      string supplier = HttpContext.Current.Session["Supplier"].ToString(); 
      string groupw = HttpContext.Current.Session["Group"].ToString(); 
      string external = HttpContext.Current.Session["External"].ToString(); 

      MyEnts autocomplete = new MyEnts(); 

      var r = from p in autocomplete.tblAutoCompletes 
         where p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText) 
         select p.ACItem; 

      if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 

      if (supplier == "Supplier") 
       r = r.Where(p => p == supplier); 

      if (groupw == "Group") 
       r = r.Where(p => p == groupw); 

      if (external == "External") 
       r = r.Where(p => p == external); 

      r.OrderBy(p => p); 

      return r.ToArray(); 

То, что я пытаюсь получить с динамическим, где положение вдоль линий ниже.

Должно ли inhouse = "Inhouse", тогда в список предметов должно входить слово "Inhouse". Если inhouse! = «Inhouse», слово «Inhouse» должно быть исключено из списка.

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

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

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

+1

Я не понимаю вашу цель здесь, если 'ACItem' содержит префиксный текст, то наверняка вам понадобятся все записи, которые это делают. Во-вторых, из вашего кода можно предположить, что ACItem - это строка, возвращаемая с вашего объекта, поэтому последующие сравнения будут терпеть неудачу, если ACItem не будет «Inhouse», «Поставщик», «Группа» или «Внешний». По сути, вы создаете рутину для автоматического завершения для 4 слов. Является ли ACItem, как я подозреваю, более сложным, чем просто строка? – Lazarus

+0

Помимо всего прочего, ваш заказ ничего не делает - вам нужно 'r = r.OrderBy (p => p);' –

+0

Привет, Лазарь (хорошо сделано, вернувшись из мертвых, кстати, вернусь). ACItem - это столбец, содержащий список возвращаемых элементов автозаполнения. Мой сценарий включает в себя настройки пользователя (через сеансы), в результате чего я могу ограничить доступ к пользователю. Поэтому, если им не разрешено видеть Inhouse, список автозаполнения не отображает эти элементы. Если это невозможно, или очень сложно для такого простака, как я, я мог бы просто оставить их в списке и поместить некоторые проверки после того, как они выбрали элемент. –

ответ

1

Не совсем уверен, о вашей проблеме здесь, но если вы хотите, чтобы исключить то не код быть что-то вроде

if (inhouse == "Inhouse") 
       r = r.Where(p => p == inhouse); 
else 
       r = r.Where(p => p != inhouse); 

Oh! если вы хотите просто исключение, то код должен быть что-то вроде

if (inhouse != "Inhouse") 
        r = r.Where(p => p != inhouse); 
+0

Возможно, вы попали на что-то там VinayC. Один большой поцелуй, выходящий к вам !!! –

-1

Разве не каждый из ваших предложений Where должен содержать критерии Содержит, а некоторые не содержит?

if (inhouse == "Inhouse") 
    r = r.Where(p => p.Contains(inhouse) && !p.Contains("Supplier") && !p.Contains("Group") && !p.Contains("External")); 
0

Если множество значений для включения/исключения, как известно во время компиляции (как представляется, дело в вашем примере), я думаю, что это может управляются одним запросом:

string memberid = HttpContext.Current.Session["MemberID"].ToString(); 
string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); 
string supplier = HttpContext.Current.Session["Supplier"].ToString(); 

bool includeInHouse = (inhouse == "Inhouse"); 
bool includeSupplier = (supplier == "Supplier"); 

MyEnts autocomplete = new MyEnts(); 

var r = from p in autocomplete.tblAutoCompletes 
      where (p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText)) 
      && (includeInHouse || (p.ACItem != "InHouse")) 
      && (includeSupplier || (p.ACItem != "Supplier")) 
      select p.ACItem; 

r.OrderBy(p => p.ACItem); 

return r.ToArray(); 

Я устранил несколько случаев для краткости.

-1

Сортировка.

вар г = от р в autocomplete.tblAutoCompletes , где p.MemberId == MemberId & & p.LocationId == locationid & & p.ACItem.Contains (prefixText) выберите p.ACItem;

 if (inhouse != "Inhouse") 
      r = r.Where(p => p != "Inhouse"); 

     if (supplier != "Supplier") 
      r = r.Where(p => p != "Supplier"); 

     if (groupw != "Group") 
      r = r.Where(p => p != "Group"); 

     if (external != "External") 
      r = r.Where(p => p != "External"); 

     r = r.OrderBy(p => p); 

     return r.ToArray(); 

Я должен был установить исключение в кавычках, как сеанс vlaue неуместно и не выбрал бы что-нибудь из списка.

Спасибо всем тем, кто помогает и помогает мне.

+0

О, ну, нет пива, нет поцелуя :(- рад, что ты его разобрал :) –

+0

Джим - держи глаза на моих вопросах. Очень новое для всего этого так много возможностей для пива и поцелуев !!! –