2015-04-17 3 views
0
var storeIds = repository.Get<Store>() 
       .Select(s => s.Id) 
       .ToList(); 

var storeReceipts = repository.Get<Receipt>() 
     .Where(r => DbFunctions.TruncateTime(r.LogDate) == today) 
     .GroupBy(r => r.StoreId) 
     .Select(g => new { Id = g.Key, Sales = g.Sum(r => r.TotalPrice) }) 
     .GroupJoin(storeIds, x => x.Id, s => s, (x, s) => x ?? new { Id = s, Sales = 0 }); 

В основном я хочу, чтобы GroupJoin добавила запись в последовательность для любого магазина, у которого нет записей чеков.Linq GroupJoin добавить записи по умолчанию

Мой синтаксис выше с ?? не скомпилирован (даже если он не был уверен, что он правильный).

+0

Что тип 'storeReceipts', что вы пытаетесь достичь? – MarcinJuraszek

+0

последовательность анонимного типа {Id, Sales}, где, если в магазине нет продаж, есть запись с идентификатором, но Sales = 0 – user380689

ответ

1

Если вы хотите присоединиться к двум таблицам, вы можете попробовать это.

var storeSales = from s in repository.Get<Store>() 
       join r in repository.Get<Receipt>() on s.Id equals r.StoreId into g 
       select new { 
        StoreId = s.Id, 
        Sales = g.Sum(x => (decimal?)x.TotalPrice) ?? 0 
       }; 

Он выбирает из Stores первого, так что вы получите запись для каждого магазина. Затем он присоединяется к Receipts, сопоставляя идентификатор магазина в группе g, которая объединяет два.

Это позволяет выбрать вашу форму вывода, по одному элементу в магазине. В этом случае Id магазина как StoreId, и сумма значений TotalPrice для каждой квитанции в качестве Sales.

Если не было квитанций для магазина, эта сумма будет в конечном итоге 0.

+0

Когда я попробовал это, я получил исключение: значение cast to value 'System.Decimal' не удалось, поскольку материализованное значение равно null. Либо общий параметр типа результата, либо запрос должны использовать тип с нулевым значением. – user380689

+0

@ user380689 Является ли поле 'TotalPrice' равным нулю? Не могли бы вы отправить код для класса «Квитанция» (добавленный к вашему вопросу). – Alex

+0

Нет его значения недействительны: public decimal TotalPrice {get; задавать; } – user380689

Смежные вопросы