私は純粋なFluent API Code-Firstを使用しています。私はエンティティで属性を使用せず、私は自分のコンテキストを別にしています。私は、を持っており、OrderDetails
と1対多の関係を持ち、OrderID
でつながっています。したがって、私は次のように持っているEntityTypeConfiguration<OrderDetailEntity>
を持っている:Linq To Entities間接コンテキストテーブルFluent APIに参加
HasRequired(x => x.Order).WithMany(x => x.Details);
HasRequired(x => x.Item);
アイテムの価格と関係を持っています。しかし、その関係はデカルトである。 1つのアイテムに200+ ItemPrices
が関連付けられています。 ItemPrice
は次のようになります。
public string CurrencyCode { get; set; }
public int PriceTypeID { get; set; }
public decimal Price { get; set; }
通貨の3 PriceTypes
、および数十があります。
私はそれが適切なので、好みの商品とItemPrice
との間の関係を定義するItemPrice
のために考慮してください。
HasRequired(x => x.Item).WithMany(x => x.ItemPrices);
項目は、通貨コードまたはPrice
型がありません。アイテムは単なるアイテムであり、通貨コードと価格タイプはOrder
が配置された時点で決定されます。これらの2つの変数は注文にあります。
SQL::
SELECT *
FROM Orders o
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
INNER JOIN Items item ON od.ItemID = item.ItemID
INNER JOIN ItemPrices itemPrice ON item.ItemID = itemPrice.ItemID AND o.CurrencyCode = itemPrice.CurrencyCode AND o.PriceTypeID = itemPrice.PriceTypeID
そして、LINQの:だから、注文の価格を決定するために、私はこの持ち
context.Orders
.Join(context.OrderDetails,
o => o.OrderID,
od => od.OrderID,
(o, od) => new { o, od })
.Join(context.Items,
o2od => o2od.od.ItemID,
item => item.ItemID,
(o2od, item) => new { o2od, item })
.Join(context.ItemPrices,
o2od2item => new { o2od2item.item.ItemID, o2od2item.o2od.o.CurrencyCode, o2od2item.o2od.o.PriceType },
itemPrice => new { itemPrice.ItemID, itemPrice.CurrencyCode, itemPrice.PriceType },
(o2od2item, itemPrice) => new { o2od2item, itemPrice })
ロングストーリーショート:間の間接的な関係がありますOrder
とItemPrice
との間で、Order
の価格を計算することに関する文脈で。
他のすべてのLINQは美しく、ナビゲーションプロパティを正しく使用しています。 Fluent APIでこのコンテキスト・リレーションシップを定義し、LINQにOrder - > Detail - > Item - > Priceがあるときに使用する方法はありますか?あるいは毎回関係のマニュアル定義を行う必要がありますか?