我用谷歌搜索了几个小时,但无法得到满意的答案。假设我有一个表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会在一次交易中完成同样的事情吗?
答案 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();