2012-06-18 3 views
2

Я должен показать одну строку за один счет в моей программе, но один счет имеет более 1 суб-счета. Я хотел бы сгруппировать информацию из двух таблиц в один DataGridView. 1 строка должна отображать сгруппированную информацию обо всех суб-счетах. Только 2 столбца более сложны, чем другие: «Описание» и «Сумма». «Описание» должно содержать все описания суб-счетов и быть ограничено новой строкой. Я сделал это следующим образом:Как я могу сократить запрос linq?

var documentQuery = (from doc in entities.Bas_DocumentData 
       select new 
         { 
          DocumentNum = doc.DocumentNum, 
          DocumentDate = doc.DocumentDate, 
          Description = doc.Bas_BonusData.Select(t => t.Description), 
          BillsCount = doc.Bas_BonusData.Count, 
          SupplierNum = doc.Bas_BonusData.Select(cred => cred.SupplierNum).FirstOrDefault(), 
          Debitor = doc.Bas_BonusData.Select(deb => deb.DebitorNum).FirstOrDefault(), 
          Manager = doc.Bas_BonusData.Select(manager => manager.ManagerName).FirstOrDefault(), 
          SupplierName = doc.Bas_BonusData.Select(supp => supp.SupplierName).FirstOrDefault(), 
          Sum = doc.Bas_BonusData.Sum(bill => bill.Price), 
          IsPrinted = doc.isPrinted, 
          IsSent = doc.isSent, 
          NotSummarize = doc.NotSummarize 
         }).OrderBy(key => key.DocumentNum) 
         .ToList() 
         .Select(q => new AcceptedBonusProjection 
         { 
          DocumentNum = q.DocumentNum, 
          DocumentDate = q.DocumentDate, 
          Description = String.Join("\n\r", q.Description.ToArray()), 
          BillsCount = q.BillsCount, 
          SupplierNum = q.SupplierNum, 
          Debitor = q.Debitor, 
          Manager = q.Manager, 
          SupplierName = q.SupplierName, 
          Sum = q.Sum, 
          IsPrinted = q.IsPrinted, 
          IsSent = q.IsSent, 
          NotSummarize = q.NotSummarize 
         }); 

Есть ли лучший способ достичь моей цели? В каком порядке я могу сократить этот запрос?

ответ

4

Первая половина (. Anony структура) не требуется вообще:

var documentQuery = 
    entities.Bas_DocumentData 
    .OrderBy(key => key.DocumentNum) 
    .Select(q => new AcceptedBonusProjection 
         { 
          DocumentNum = q.DocumentNum, 
          /* same as in your select snipped here as it does not add value */ 
          NotSummarize = q.NotSummarize 
         }) 
    .ToList(); 

Примечание: Пожалуйста, обратите внимание, что вы делаете некоторые подзапросы, которые, возможно, не очень хорошо масштабируется (выбор из другой таблицы в запросах , например doc.Bas_BonusData.Select(manager => manager.ManagerName).FirstOrDefault()) - это НЕ будет переведено во внутреннее/внешнее соединение и приведет к многочисленным DB-запросам. Нежелательная загрузка не решит эту проблему! Чтобы изменить это, вам следует использовать SQL-View/StoredProcedure/LINQ-Join Statement.

+0

спасибо. Информация полезна для меня. И я буду использовать SQL-View для достижения своей цели. – Drac

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