2

私のプログラムでは 1 つの請求書に対して 1 つの行を表示する必要がありますが、1 つの請求書に複数のサブ請求書があります。2 つのテーブルの情報を 1 つの DataGridView にグループ化したいと考えています。1 行には、すべての下位請求書に関するグループ化された情報を表示する必要があります。他の列よりも複雑なのは、「説明」と「合計」の 2 つの列だけです。「説明」には、サブ請求書のすべての説明が含まれ、改行で区切られている必要があります。私は次の方法でそれを作りました:

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

1 に答える 1

4

前半 (anony.struct) はまったく必要ありません。

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 クエリが発生します。Eager ローディングではこの問題は解決しません! これを変更するには、SQL-View/StoredProcedure/LINQ-Join ステートメントの使用を検討する必要があります。

于 2012-06-18T12:54:03.280 に答える