2012-06-18 55 views
2

我必須在我的程序中顯示每行一個帳單中的一行,但一個帳單有多個子帳單。我想從一個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 Statements來改變它。

+0

謝謝。信息對我很有用。我將使用SQL-View來實現我的目標。 – Drac