2014-09-03 76 views
0

我有兩個類:OrderDTO和ProductsDTO。在LINQ(或子查詢)中嵌套查詢結果

public class OrderDTO 
{ 
    // Attributes 
    public int OrderID { get; set; } 
    public DateTime OrderDate { get; set; } 
    public int EmployeeID { get; set; } 

    // Collection of Products 
    List<ProductDTO> Products { get; set; } 
} 

public class ProductsDTO 
{ 
    // Attributes 
    public int ProductID { get; set; } 
    public string Name { get; set; } 
} 

另外我有表:訂單,產品和ProductOrder。

我想選擇與相關產品的訂單並在一個查詢中返回它們。

例子:

using(var ctx = new Database()) 
{ 
    return from o in ctx.Orders 
     join po in ctx.ProductOrder on o.OrderID equals po.OrderID 
     where o.OrderID == 1 
     select new OrderDTO 
      { 
       OrderID = o.OrderID, 
       OrderDate = o.OrderDate, 
       EmployeID = o.EmployeeID, 

       Products = (new ProductDTO 
       { 
        ProductID = po.ProductID, 
        Name = po.Name 
       }).ToList(); 
      } 
} 

我想補OrderDTO與秩序的屬性,也充滿了產品的集合。

+0

那麼你的問題是什麼。你有錯誤嗎?如果是這樣,你能提供嗎? – 2014-09-03 18:48:25

回答

2

既然你想加入到返回每對匹配的項目,而不是創建一個新的項目的集合,要執行一個GroupJoin而非Join。 synatx雖然非常相似。

using(var ctx = new Database()) 
{ 
    return (from o in ctx.Orders 
     join po in ctx.ProductOrder on o.OrderID equals po.OrderID 
     into products 
     where o.OrderID == 1 
     select new OrderDTO 
      { 
       OrderID = o.OrderID, 
       OrderDate = o.OrderDate, 
       EmployeID = o.EmployeeID, 

       Products = products.Select(po => new ProductDTO 
       { 
        ProductID = po.ProductID, 
        Name = po.Name 
       }).ToList(); 
      }).ToList(); 
} 

另請注意,您在實際獲取查詢結果之前正在處理數據庫。您需要在處理上下文之前實現查詢的結果。

+0

+1最好用'.ToList()'趕上,但是不會裏面的一個拋出異常? – 2014-09-03 18:57:39

+0

很確定它不會。我希望查詢提供者來處理它。如果它真的不能有選擇。 – Servy 2014-09-03 19:04:24

+0

我幾乎正是我想要的。我只想檢索一個OrderDTO及其關聯的ProductsDTO(在Products欄位中)。如果我的結果是OrderDTO的集合,並且Products中只有一個ProductDTO字段。例如,如果我訂購OrderID = 1和6個關聯產品。結果將是OrderID = 1的6個訂單,並且每個Products屬性都將是一個(但不同的關聯ProductDTO)。我如何創建一個OrderDTO的結果集合ProductDTO? – kat1330 2014-09-03 23:20:24

2
(from o in ctx.Orders 
where o.OrderID == 1 
select new OrderDTO 
      { 
       OrderID = o.OrderID, 
       OrderDate = o.OrderDate, 
       EmployeID = o.EmployeeID, 

       Products = from p in o.Products select 
       new ProductDTO 
       { 
        ProductID = p.ProductID, 
        Name = p.Name 
       }; 
      }).ToList(); 

您可以簡單地使用OrderProduct之間的關係,因此無需顯式連接。您也不能在查詢中執行.ToList(),因此您需要在dto對象中將您的products設置爲IEnumerable

public class OrderDTO 
{ 
    // Attributes 
    public int OrderID { get; set; } 
    public DateTime OrderDate { get; set; } 
    public int EmployeeID { get; set; } 

    // Collection of Products 
    IEnumerable<ProductDTO> Products { get; set; } 
}