他のエンティティによって形成された「複雑な」エンティティがいくつかあります。たとえば、「注文」エンティティ:
- 注文
- OrderDetail (子)
- OrderDetailsDiscount (子の子)
- 注文支払
- 注文状態
Order クラスのコード:
[MetadataType(typeof(OrderMetadata))]
public partial class Order
{
public OrderPaymentStatus PaymentStatus {
get { return Paid ? OrderPaymentStatus.Paid : OrderPaymentStatus.Pending; }
}
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return OrderPayments.Sum(p => p.Amount);
}
}
public decimal TotalRefund {
get {
return OrderRefunds.Sum(p => p.Amount);
}
}
public decimal TotalDebt {
get {
return Total - TotalPaid + TotalRefund;
}
}
public decimal TotalDiscounts {
get {
return ((SubTotal * DiscountPercentage) / 100) + DiscountAbsolute;
}
}
public decimal TotalSurcharges {
get {
return ((SubTotal * SurchargePercentage) / 100);
}
}
[DisplayFormat(DataFormatString="{0:C}", ApplyFormatInEditMode = false)]
public decimal Total {
get {
return SubTotal - TotalDiscounts + TotalSurcharges;
}
}
public decimal TotalTax {
get {
return (TaxEnabled) ? OrderDetails.Sum(t => t.Taxes): 0;
}
}
public decimal SubTotal {
get {
return OrderDetails.Sum(o => o.Total) + TotalTax;
}
}
public decimal DiscountOffers {
get {
return OrderDetails.Sum(o => o.DiscountOffers);
}
}
public bool HasOffers {
get {
return DiscountOffers > 0;
}
}
public decimal SurchargePercentage {
get {
return OrderSurcharges.Sum(o => o.ChargePercentage);
}
}
public decimal DiscountPercentage {
get {
return OrderDiscounts.Where(o => o.Type == (int)DiscountType.Percentage).Sum(o => o.Value);
}
}
public decimal DiscountAbsolute
{
get
{
return OrderDiscounts.Where(o => o.Type == (int)DiscountType.Absolute).Sum(o => o.Value);
}
}
}
注文の合計を動的に計算するので、たとえば 1000 件の注文のリストを提示するときに DB への複数のクエリを避けるために、最初から OrderDetail.* をロードする必要があるため、このメソッドを汎用リポジトリに実装しました。
public virtual IQueryable<T> GetAllIncluding(params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = Fetch();
foreach (var includeProperty in includeProperties)
{
query = query.Include(includeProperty);
}
return query;
}
そして、私はそれを私のコードから次のように呼び出します:
private IEnumerable<Order> GetAllOrders()
{
return unitOfWork.OrderRepository.GetAllIncluding(
o => o.OrderDiscounts,
o => o.OrderPayments,
o => o.OrderSurcharges,
o => o.OrderStates,
o => o.OrderRefunds,
o => o.OrderDetails,
o => o.OrderDetails.Select(d => d.OrderDetailDiscounts),
o => o.OrderDetails.Select(d => d.OrderDetailOffers),
o => o.User,
o => o.Employee,
o => o.Store,
o => o.TerminalSession);
}
わかりました..動作します..問題は、これを使用して他の複雑なオブジェクトをクエリする必要がある場合です。たとえば、他の子エンティティで構成されるユーザーエンティティがあります。
- ユーザー
- ユーザーポイント
- ユーザー状態
- ...
エンティティのグループ全体をロードするように EF に指示する方法はありますか?大量のレコードを要求するときに、データベースにアクセスするのを避けるために完全にロードされた Orders と Users を使用してクエリを実行できます (遅延ロードを無効にしたくありません)。