2017-02-28 7 views
0

私は純粋な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 }) 

ロングストーリーショート:間の間接的な関係がありますOrderItemPriceとの間で、Orderの価格を計算することに関する文脈で。

他のすべてのLINQは美しく、ナビゲーションプロパティを正しく使用しています。 Fluent APIでこのコンテキスト・リレーションシップを定義し、LINQにOrder - > Detail - > Item - > Priceがあるときに使用する方法はありますか?あるいは毎回関係のマニュアル定義を行う必要がありますか?

答えて

1

私のSQLの脳をLinqに適用すると、ほとんどの単純な結合がWHERE節に移動できることを覚えています。私はむしろ内のテーブル間の関係を説明するだろうが

context.Orders 
.Where(x => orderIDs.Contains(x.OrderID) 
    && x.Details.Any(y => 
     y.Item.ItemPrices.Any(z => 
      && z.CurrencyCode == x.CurrencyCode 
      && z.PriceType == x.PriceType 
    ))) 

:これは流暢APIでのご注文とItemPrices間の文脈の関係を定義するのに役立ちませんがだから、それは私がそうのように参加せずにきれいにLINQを使用することができません別のコンテキストでは、このLINQクエリは、ジョインの代わりにナビゲーションプロパティに依存する必要があります。