2014-09-03 3 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가 있습니다.

관련 제품이있는 주문을 선택하고 하나의 쿼리로 반환하고 싶습니다.

예 : 내가 주문 속성을 OrderDTO을 작성하고 또한 제품과 함께 컬렉션을 채우기 위해 싶습니다

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(); 
      } 
} 

.

+0

귀하의 질문은 무엇입니까? 오류가 있습니까? 그렇다면 제공 할 수 있습니까? –

답변

2

당신은 Join보다는 GroupJoin을 수행 할. 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

마지막'.ToList()'가 +1 잘 잡았지만 내부는 예외를 던지지 않습니까? –

+0

확실하지 않을 것입니다. 나는 쿼리 제공자가 그것을 처리 할 것으로 기대한다. 그것이 정말로 옵션이 있지만 수 없다면. – Servy

+0

나는 내가 원하는대로 거의 정확하게있다. 나는 ProductsDTO (Products 필드에서)와 관련된 콜렉션으로 OrderDTO를 하나만 가져 오려고합니다. 내 결과가 제품 필드에 하나의 ProductDTO 만있는 OrderDTO의 모음 인 경우 OrderID = 1 및 6 개의 관련 제품으로 주문한 경우의 예입니다. 결과는 OrderID = 1 인 6 개의 주문이되며 모든 제품 등록 정보에는 하나 (그러나 연관된 다른 ProductDTO)가됩니다. ProductDTO 모음으로 하나의 OrderDTO 결과를 어떻게 만들 수 있습니까? – kat1330

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()을 사용할 수 없으므로 012oo을 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; } 
}