2013-01-23 126 views
2

我有兩個實體一對多關係:訂購使用LINQ

Order: 
int OrderId 
string OrderNumber 
... 

OrderItem: 
int ItemId 
int sequence 
decimal Quantity 
... 

一個Order有多個OrderItems,我想寫一個LINQ與他們的項目和項目將返回所有訂單由序列進行排序領域。 我如何編寫查詢如下面的查詢?

Order myOrder = db.Orders.Include("OrderItems").Include("sequence").FirstOrDefault(x => x.OrderId == 3); 

回答

1

你不能這樣做,沒有結果突出到一個新的類型。

var myOrder= db.Orders.Include("OrderItems") 
      .Where(x => x.OrderId == 3) 
      .Select(o => new { 
       order = o, 
       orderItems = o.OrderItems.OrderBy(i => i.sequence) 
      }).FirstOrDefault(); 

// Usage 
myOrder.order; // Order 

myOrder.order.OrderItems; // OrderItems 
myorder.orderItems; // OrderItems alternative 

雖然它不是理想的根據this blog post它投射到一個新的對象,有一個很好的副作用,現在order.OrderItems您的匿名對象將正確得進行排序。

+0

謝謝,但我編輯了我的代碼,我的新代碼返回一個訂單 – Masoud

+0

它返回一個匿名類型的集合。每個項目都有'order'和'orderItems'屬性。 –

+0

如果我的方法必須返回訂單類型而不是匿名類型呢? – Masoud

-1
var Orders = db.Orders.Include(a => a.OrderItems) 
.OrderBy(a => a.OrderItems.sequence).ToList() 

我建議使用lambda表達式,以避免在查詢魔術字符串。

+0

序列不是秩序的一部分... –

+0

對不起編輯我的答案 – rexcfnghk

+0

但用這種方法我沒有訪問順序,因爲a.OrderItems是爲了項目列表並不是一個簡單的訂單項目 – Masoud

2
var result = from a in Order 
      join b in OrderItems 
       on a.Id equals b.OrderId 
      order by b.sequence 
      select new 
      {  
       a.Id, 
       b.sequence, 
       ... 
      }; 
2
var temp = db.Orders.Include("OrderItems").Select(q => q.OrderItems.OrderBy(p => 
        p.sequence)).ToList(); 
+0

感謝NIRANJAN,我編輯了我的代碼,你可以再次檢查一遍嗎? – Masoud