2016-12-22 4 views
0

У меня есть таблица данных о продажах, которая состоит из отдельных продаж товаров, несколько строк составляют единый счет (BillID) в системе. Данные выглядят так:Linq grouping на основе требований

CompanyID | StoreID | BillItemID | Биллид | DateKey | Описание | куча других столбцов для проданной суммы и налогов и т. д.

Все, что имеет значение, это действительно Биллид, мне нужно найти счета, которые содержат оба элемента, которые включены в оператор linq where where.

Вот мое текущее заявление LINQ

FactSales 
    .Where(c => c.CompanyID == 433) 
    .Where(c => c.StoreID == 360) 
    .Where(c => c.Description == "2 Piece Combo" || c.Description=="3 Piece Combo") 
    .GroupBy(m => new { m.BillID }) 

Это выбирает все продажи, которые были 2 или 3 шт комбо. Но группа не предоставляет необходимую мне информацию, потому что бывают случаи, когда люди покупают несколько единиц одного и того же элемента, чтобы эти Биллид не отражали счета, в которых продавались оба предмета.

Возможно ли это с помощью linq?

+2

Ваш вопрос немного неясно; можете ли вы предоставить образец данных и выход? – BradleyDotNET

+0

Уникальные номера BillID? Или дублируется в разных магазинах? Если это уникально, то почему вы фильтруете идентификаторы CompanyID и Store ID. Особенно в тех случаях, когда некоторые компании могут иметь несколько номеров CompanyID, но совместно используют отделы биллинга. – jdweng

+0

BillIDs не уникальны, они требуют, чтобы хранилище и companyid, чтобы идти с ними, были уникальными, но в случае этого запроса идентификатор billID уникален, потому что установлены два других фактора – Nate58

ответ

2

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

Существует несколько способов сделать это.

Например, подсчет отдельных элементов в группе:

... 
.Where(g => g.Select(c => c.Description).Distinct().Count() == 2) 

или проверки содержания группы для существования элемента (дублирование Where условий фильтра):

... 
.Where(g => g.Any(c => c.Description == "2 Piece Combo") && 
    g.Any(c => c.Description == "3 Piece Combo")) 
+0

Это было это спасибо Ивану. – Nate58

0

Как насчет того, чтобы добавить другое условие с «& &», где вы проверяете количество проданного товара больше 1. Обратите внимание, что OR было сгруппировано.

FactSales 
.Where(c => c.CompanyID == 433) 
.Where(c => c.StoreID == 360) 
.Where(c => (c.Description == "2 Piece Combo" || c.Description=="3 Piece Combo") && c.purchaseQuantity > 1) 
.GroupBy(m => new { m.BillID }) 
Смежные вопросы