繁体   English   中英

LINQ(或子查询)中的嵌套查询结果

[英]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();

您可以简单地使用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; }
}

由于您希望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM