sql返回父项列表及其嵌套子集合

时间:2015-08-01 17:46:06

标签: c# sql sql-server

我用谷歌搜索了几个小时,但无法得到满意的答案。假设我有一个表tblCustomers和一个相关的tblOrders。这是您典型的父子关系,tblCustomers中只有一个唯一客户,但客户可以在tblOrders中拥有多个订单。现在在C#中,我有像这样的Customer和Orders对象

public class Customer
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }

   //Nested child Order collection
   public List<Order> Orders { get; set; }
}

public class Order
{
   public int Id { get; set; }
   public int CustomerId { get; set; }
   public string ItemName { get; set; }
   public decimal Amount { get; set; }
}

如何在一个交易中返回客户列表及其嵌套订单?我试过这个sql

var sql = @"SELECT c.*,
            (SELECT TOP 100 o.* FROM [dbo].[tblOrders] AS o 
             WHERE c.Id = o.CustomerId
             ORDER BY o.ItemName ASC) AS Orders
           FROM [dbo].[tblCustomers] AS c";

var listOfCustomers = dbContext.Database.SqlQuery<Customer>(sql).ToList();

但我收到此错误

  

当选择列表中只能指定一个表达式时   子查询不是用EXISTS引入的。

有人在我的sql中发现错误( sql不是我的一杯茶)或者知道一个更好的sql会在一次交易中完成同样的事情吗?

1 个答案:

答案 0 :(得分:0)

我们不能在子查询中使用*我们必须指定1列嵌套查询必须只返回一列进行比较

SELECT c.*,
            (SELECT TOP 100 o.CustomerId  FROM [dbo].[tblOrders] AS o 
             WHERE c.Id = o.CustomerId
             ORDER BY o.ItemName ASC) AS Orders
           FROM [dbo].[tblCustomers] AS c

我们也可以这样做

SELECT c.*
FROM [dbo].[tblCustomers] AS c
WHERE c.Id in
(SELECT TOP 100 o.CustomerId  FROM [dbo].[tblOrders] AS o 
c.Id = o.CustomerId
ORDER BY o.ItemName ASC)

使用Linq

var CustOrd = (from c in dbContext.Customers
                  join o in dbContext.Orders on c.Id equals o.CustomerId 
                  select new
                  {
                      c,
                      o
                  }).ToList();
相关问题