2017-02-28 36 views
0

我正在使用純Fluent API Code-First。我沒有在我的實體上使用屬性,並且我保持獨立的上下文。我有一個OrderEntity它與OrderDetails有一對多的關係,加入OrderID。因此,我有一個EntityTypeConfiguration<OrderDetailEntity>它有以下幾種:Linq To實體間接上下文表格在Fluent API中加入

HasRequired(x => x.Order).WithMany(x => x.Details); 
HasRequired(x => x.Item); 

一個項目與它的價格有關係。但是這種關係是笛卡爾式的。一個項目有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被放置時確定的。這兩個變量在訂單上。因此,確定訂單的價格,我有這樣的:

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子句中。因此,雖然這並不能幫助來定義流利API次序和ItemPrices之間的上下文關係,它允許我使用清潔的LINQ沒有加入像這樣:

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 
    ))) 

雖然我寧願描述表之間的關係不同的上下文,這個LINQ查詢滿足了我需要依賴導航屬性而不是連接。