2017-06-18 47 views
1

我有一個Order實體,它擁有多個OrderItem實體。和類看起來像那樣。從主人到詳細信息的關係,但不是反之亦然

class Order 
{ 
    int Id; 
    string Note; 
    List<OrderItem> OrderItems; 
} 

class OrderItem 
{ 
    int Id; 
    string Name; 
} 

,你可以看到,Order知道其OrderItemsOrderItem不知道它的Order

問題是如何編寫linq查詢來查詢屬於特定orderOrderItem的上下文?

+0

我對EF來說很新,所以我對這個工具不太瞭解,但是我在嘗試context.OrderItems.Where(x => x.Order.Id == 999)。但是這是我遇到問題的地方,沒有屬性x.Order來提供查詢。 – Sisyphus

+0

通常情況下,您將在'OrderItem'中擁有'OrderId'。爲什麼不在那裏?你寫了那些課嗎?如果它們是生成的,我真的很想知道你的數據模型......如果你寫了它們,簡單地在它所屬的地方添加OrderId。現在,您只能獲取屬於訂單的所有訂單項(從來沒有一個訂單項):Order.OrderItems。 – oerkelens

回答

2

你會查詢正確的Order,然後選擇相關OrderItem(S),e.g:

var orderItems = context.Orders 
         .Where(o => o.Id == selectedId) 
         .Select(o => o.OrderItems) 
         .ToList(); 

這給你的ID爲selectedId相關聯的訂貨訂單項的列表。

2

您需要OrderItem類中的Order屬性。你也應該使用你的類,而不是領域properties象下面這樣:

public class Order 
{ 
    public int Id { get; set; } 
    public string Note { get; set; } 
    public virtual ICollection<OrderItem> OrderItems { get; set; } 
} 

public class OrderItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual Order Order { get; set; } 
} 

另外請注意,我用的virtual關鍵字和ICollection代替List這使得屬性支持延遲加載。

2

Context.Orders.Where(x => x.Id == 1234).SelectMany(x => x.OrderItems);

,或者你可以做Context.Where(x => x.Id == 1234).Include(x => x.OrderItems)獲取訂單和預加載的項目。

我建議讓Order.OrderItems屬性爲虛擬的,所以至少如果您忘記了預加載(或.Include),那麼您將不會從數據庫加載不一致的數據。