Использование условия в LINQ

1

Как я могу переписать это с помощью условия в LINQ?

Если selectID = ноль, я хочу, чтобы это выполнялось:

   var products = from p in product.Table
       orderby p.Name
       where (p.stock == stockId)
      select p;        

Если selectID NOT zero, я хочу, чтобы это выполнялось:

   var products = from p in product.Table
       orderby p.Name
       where (p.stock == stockId) &&        
             (p.Id == selectID)
      select p;             

Это ниже, но я должен использовать "фиктивное" второе условие (p.hidden == false) для работы троичного оператора:

   var products = from p in product.Table
       orderby p.Name
       where (p.stock == stockId) &&        
      (selectID != 0 ? p.Id == selectID : p.hidden == false)
      select p;             

Есть ли способ избавиться от (p.hidden == false), потому что это не требуется в логике и именно там, чтобы заставить оператора работать. благодаря

Теги:
linq
asp.net-mvc
asp.net-mvc-4
entity-framework-5

2 ответа

6
Лучший ответ

Вы можете использовать тот же идентификатор, что и запись, как резервное значение:

var products = from p in product.Table
               orderby p.Name
               where p.stock == stockId && 
                     p.Id == (selectID == 0 ? p.Id : selectID)
               select p; 

Однако, поскольку это может привести к менее эффективному планированию запросов, я бы просто использовал if-else:

var products = product.Table.Where(p => p.stock == stockId);
if(selectID != 0)
    products = products.Where(p => p.Id == selectID);
products = products.OrderBy(p=> p.Name);
  • 0
    тогда нет необходимости в этом условии, просто передайте selectID
  • 0
    оба отлично работали, спасибо. Что-то я не понимаю в первом запросе. Если selectID = 0, то p.ID = p.ID. Он по-прежнему выбирает все записи, но я не понимаю, что означает «p.ID = p.ID»?
Показать ещё 2 комментария
2

Вы также можете написать так:

var products = from p in product.Table
       orderby p.Name
       where (p.stock == stockId) &&        
             (p.Id == selectID || selectID == 0)
      select p;

|| selectID == 0 || selectID == 0 просто возвращает true, если идентификатор не указан и по-прежнему разрешает выполнение запроса по вашему желанию. Ниже приведена ссылка на то, как я узнал этот простой трюк.

http://www.sommarskog.se/dyn-search-2008.html

  • 0
    хороший трюк! Я использовал нечто подобное со строками: (selectID == null || p.Id == selectID), но это не очень хорошо работает с int или даже с nullable int.
  • 0
    Что бы ни работало :). Насколько мне известно, какие проблемы у вас были с этим подходом?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню