2013-12-10 3 views
1

У меня здесь проблема. У меня есть элемент Linq, который фильтрует список объектов из базы данных.Linq Where Clause в сочетании с условным

Предположим, у меня есть следующий список элементов (каждый «{...}» представляет собой один объект из списка):

{id: 288, id_price_table: 1}, 
{id: 295, id_price_table: 1}, 
{id: 295, id_price_table: 2}, 
{id: 295, id_price_table: 3} 

И у меня есть два paramters, один «StandardPriceTable», а другой один - «CurrentUserPriceTable». В моем случае этот paramters являются следующим:

Int32 StandardPriceTable = 1; 
Int32 CurrentUserPriceTable = 2; 

Теперь то, что я хочу достичь, это: Сделать где положение, которое принимает условный, если идентификатор является уникальным (и, следовательно, принадлежит к StandardPriceTable) возвращает текущий объект к списку.

Но если тот же идентификатор принадлежит к количеству id_price_table, то он должен проверить, какой из объектов принадлежит CurrentUserPriceTable, возвращая только этот объект, за исключением других с тем же идентификатором.

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

Исходя из условий я рассказал результат исполнения запроса будет равен: IQueryable со следующими itens:

{id: 288, id_price_table: 1}, 
{id: 295, id_price_table: 2} 

ответ

1

Как о:

var result = from item in Items 
      group item by item.Id into g 
      select g.Single(i => g.Count() == 1 ? 
            true : 
            i.Id_price_table == CurrentUserPriceTable); 

или с использованием лямбда:

var result2 = Items.GroupBy(i => i.Id) 
        .Select(g => g.Single(i => g.Count() == 1 ? 
               true : 
               i.Id_price_table == CurrentUserPriceTable)); 
+0

Можете ли вы перевести это на лямбда-представление? Это не вызовет запрос базы данных? –

+0

Dominic Спасибо, что решил мою проблему. Мне просто пришлось настроить «одиночный» метод на «firstordefault». Не могли бы вы объяснить выбранную часть одним методом? Я здесь новичок и борется. –

+1

@MarcosSantini Если вы хотите буквально * single * result или 'null', если нет элементов или больше одного, используйте« SingleOrDefault ». 'FirstOrDefault' следует использовать, когда требуется первый элемент (когда возможно более одного) или' null', когда последовательность пуста. – BartoszKP