2

売上のすべての送料を取得するクエリを作成し、それを推定送料と比較する必要があります。これが私のクエリです:

var sales = (from sale in db.Sales
             where sale.DateOfSale > startDate && sale.DateOfSale < endDate
             group sale by new {sale.ItemID, sale.EstimatedShipping} into g
             select new
             {
                 ItemID = g.Key.ItemID
                 Estimate = g.Key.EstimatedShipping
                 ActualShipCosts = (from gSales in g select gSales.ActualShipping)
             }).ToList();

キーでグループを取得していないグループで何かを行ったり、 g.Count() を実行したりすると、クエリの実行が非常に遅くなるようです。タイムアウトせずにこのクエリを終了させることはできません。ここでパフォーマンスを向上させるためにできることはありますか?

4

3 に答える 3

0

結果セットを構築している間に、 ActualShipping選択を実行してみることができます。

var sales = db.Sales
    .Where(sale => sale.DateOfSale > startDate && sale.DateOfSale < endDate)
    .GroupBy(
        sale => new {sale.ItemID, sale.EstimatedShipping},
        sale => sale.ActualShipping)
    .ToList();

確かではありませんが、追加の列挙を防ぐことができます。

于 2013-10-29T14:04:06.493 に答える
0

が原因で問題が発生する可能性があると思います(from gSales in g select gSales.ActualShipping)。Linqgroup byは SQL に変換されるgroup byため、フォーム グループのレコードに直接アクセスすることはできません。の呼び出しごとに(from gSales in g select gSales.ActualShipping)個別の選択が行われます。

最初に考えられる解決策: ItemID、EstimatedShipping ペアでインデックスを作成します。

2 番目に考えられる解決策:

var sales = (from sale in db.Sales
         where sale.DateOfSale > startDate && sale.DateOfSale < endDate
         select new
         {
             ItemID = sale.ItemID
             Estimate = sale.EstimatedShipping
             ActualShipCosts = sale.ActualShipping
         }).ToList();

var groupedSales = (from sale in sales
         group sale by new {sale.ItemID, sale.EstimatedShipping} into g
         select new
         {
             ItemID = g.Key.ItemID,
             Estimate = g.Key.EstimatedShipping,
             ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList()
         }).ToList();

これにより、レコードがダウンロードされた後、オフラインでグループ化が行われます。確かにクエリの数が減りますが、データベースをチェックして、より高速かどうかを確認する必要があります。

于 2013-10-29T14:03:12.830 に答える
0

テスト用のすべてのデータベースがないとわかりにくいですが、次の行が問題になる可能性があります。

(from gSales in g select gSales.ActualShipping)

代わりにこれを試してください:

var sales = (from sale in db.Sales
             where sale.DateOfSale > startDate && sale.DateOfSale < endDate
             group sale by new {sale.ItemID, sale.EstimatedShipping} into g
             select new
             {
                 ItemID = g.Key.ItemID,
                 Estimate = g.Key.EstimatedShipping,
                 ActualShipCosts = g.Select(gSales => gSales.ActualShipping).ToList()
             }).ToList();

これにより、秒が防止されfromます。最初のクエリは奇妙な結合を行う可能性がありますが、単純な Select ではそうすべきではありません。

于 2013-10-29T13:52:28.010 に答える