Как написать динамический где в LINQ - PullRequest
1 голос
/ 19 июля 2011

У меня есть запрос LinQ, как показано ниже

var filtered=from c in country
         where c.Id>=5
         select c;

Теперь мне нужно, чтобы оператор '> =' был динамическим, т. Е. Оператор может быть '> =' или '==' или '<=' и т. Д. В зависимости от определенных критериев, и запрос должен выполняться на этот оператор. Как этого добиться в LinQ? </p>

Ответы [ 3 ]

3 голосов
/ 19 июля 2011

Вы можете сделать это так:

var filtered = country.AsQueryable();
if(cond == 0)
    filtered = filtered.Where(c => c.Id <= 5);
else if(cond == 1)
    filtered = filtered.Where(c => c.Id >= 5);
else if(cond == 2)
    filtered = filtered.Where(c => c.Id == 5);
2 голосов
/ 21 июля 2011

Я бы избегал методов "if-then-else" или "switch" и использовал бы вместо него "словарь".

Я предполагаю, что у вас есть элемент управления, позволяющий пользователю выбирать число (т.е.5) поэтому вам также понадобится способ «динамически» добавить это в запрос.

Определите этот словарь:

var filters = new Dictionary<string,
    Func<IQueryable<Country>, int, IQueryable<Country>>>()
{
    { ">", (cs, n) => cs.Where(c => c.Id > n) },
    { ">=", (cs, n) => cs.Where(c => c.Id >= n) },
    { "==", (cs, n) => cs.Where(c => c.Id == n) },
    { "<=", (cs, n) => cs.Where(c => c.Id <= n) },
    { "<", (cs, n) => cs.Where(c => c.Id < n) },
};

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

country = filters[">"](country, 5);

Или, может быть, что-то вроде этого:

country = filters[dd.Value](country, int.Parse(tb.Text));

Выкрикните, если хотите ещеобъяснение.

0 голосов
/ 19 июля 2011

Это не именно то, что вы хотите, однако я думаю, что делать то, что вы говорите, небезопасно , и это плохо для читабельности и не для повторного использования. Для этих целей я всегда стараюсь использовать новые методы и использовать их void.

 public void static FilterById(int limit, string condition, IEnumerable filter, Type country)
 {  
    var countryQueryable = country.AsQueryable();//Edit inspired by devio's comment on  Mr.Hilgarth's answer. 

    switch(condition)
   {
      case(">") :
      {
        filter = countryQueryable .Where(q=>q.Id > 5)
        break;
       } 
       case(">=") :
       {
         filter = countryQueryable .Where(q=>q.Id >= 5)
         break;
        } 
        case("=") :
        {
          filter = countryQueryable .Where(q=>q.Id == 5)
          break;
         } 
        case("<=") :
        {
          filter = countryQueryable .Where(q=>q.Id <= 5)
          break;
         } 
         case("<") :
         {
          filter = countryQueryable .Where(q=>q.Id < 5)
          break;
         } 
     }
}

РЕДАКТИРОВАНИЕ: Динамический LINQ (Часть 1. Использование библиотеки динамических запросов LINQ) может немного помочь.

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