私は、このエンティティを持っている:このLinqクエリ(ピボットの一種)を改善するにはどうすればよいですか?
public class Delivery
{
public int Id { get; set; }
public int ProductId { get; set; }
public int CustomerId { get; set; }
public int Quantity { get; set; }
public DateTime DeliveryDate { get; set; }
public virtual Product Product { get; set; }
public virtual Customer Customer { get; set; }
}
私は一週間で配達を表示したいので、私はこのクエリを記述します。
public override IEnumerable GetModelData(ApplicationDbContext context)
{
return context.Deliveries.GroupBy(x => x.Product).Select(x => new
{
Id=x.Key.Id,
Product = x.Key.Name,
Wk1 =(int?) x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 1).Sum(a => a.Quantity),
...
...
...
Wk46 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 46).Sum(a => a.Quantity),
Wk47 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 47).Sum(a => a.Quantity),
Wk48 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 48).Sum(a => a.Quantity),
Wk49 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 49).Sum(a => a.Quantity),
Wk50 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 50).Sum(a => a.Quantity),
Wk51 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 51).Sum(a => a.Quantity),
Wk52 = (int?)x.Where(a => SqlFunctions.DatePart("wk", a.DeliveryDate) == 52).Sum(a => a.Quantity),
}).ToList();
}
が小さいクエリと予想オブジェクトを取得することが可能ですか?
私は配信データベーステーブルで約100サンプルの行を持っており、この方法でデータを取得するのが最良の方法ではないと思います。
クエリは機能していますが、この種のクエリを書くためのより良い方法があるかどうかを知りたいだけです。
ロジックやコードがわかりません。週ごとに配送を表示したいとします。あなたはもっと詳しく説明できますか? 'Wk1、Wk2、etc'とは何ですか? –
私は53列のテーブルを表示しています。最初の列はProductNameで、次の52列はweek1(wk1)からweek52(wk52)までの週です。上のクエリでは、小さなクエリを表示するためにいくつかの行を削除しました。 –
うわー、あなたは生成されたSQLをチェックしましたか?私はそれがグループ化の結果に関する52の 'Where'ステートメントのためにそれがモンスターであると期待します。どのORMでbtwを使用していますか? –