[英]Nested query results in LINQ (or sub queries)
我有两个类:OrderDTO和ProductsDTO。
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; }
}
我还有表格:Orders,Products和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,并用产品填充集合。
(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();
您可以简单地使用Order
和Product
之间的关系,因此不需要显式联接。 同样,您不能在查询中执行.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; }
}
由于您希望Join
返回匹配项的集合,而不是为每对创建一个新项,因此您要执行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();
}
另请注意,当前正在实际获取查询结果之前处理数据库。 您需要在处理上下文之前具体化查询结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.