[英]Convert Sql Query To linq using sum with group by
我是linq的新手,任何机构都可以帮助我将以下查询转换为linq。
SELECT A.Name,
Sum(C.MoneyIN) - Sum(C.MoneyOut) AS Balance
FROM Customers A
JOIN Banks B ON A.Id = B.id
JOIN BankTransactions C ON B.Id = C.BankID
GROUP BY A.Name
我试图将其转换为linq
var query = from c in db.Customers
join b in db.Banks on c.Id equals b.CustomerId
join bt in db.BankTransactions on b.Id equals bt.BankId
group c by c.Name into Cust
select new
{
Name = c.Name,
Balance = Cust.Sum(bt.MoneyIn) - Cust.Sum(bt.MoneyOut)
};
有人可以告诉我我哪里错了吗?
提前致谢。
试试看:
var query = from c in db.Customers
join b in db.Banks on c.Id equals b.CustomerId
join bt in db.BankTransactions on b.Id equals bt.BankId
group bt by c.Name into Cust
select new
{
Name = Cust.Name,
Balance = Cust.Sum(x => x.MoneyIn) - Cust.Sum(x => x.MoneyOut)
};
似乎存在的问题是,在最后一个选择中,您使用了c.Name
但应该使用Cust.Name
因为您已经执行了分组。
更新1。
还有Cust.Sum(bt.MoneyIn)
=> Cust.Sum(x => x.MoneyIn)
。
更新2。
另外,您按错误的道具分组。 如果要将总和应用于BankTransactions,则需要按以下方式将其分组:
按c.Name将bt分组为Cust
因此,工作示例可能如下所示:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Bank
{
public int CustomerId { get; set; }
public int Id { get; set; }
}
public class BankTransaction
{
public int BankId { get; set; }
public int MoneyIn { get; set; }
public int MoneyOut { get; set; }
}
并编译查询:
var customers = new List<Customer>();
var banks = new List<Bank>();
var bankTransactions = new List<BankTransaction>();
var result = from c in customers
join b in banks on c.Id equals b.CustomerId
join bt in bankTransactions on b.Id equals bt.BankId
group bt by c.Name into Cust
select new { Name = Cust.Key, Balance = Cust.Sum(x => x.MoneyIn) - Cust.Sum(x => x.MoneyIn) };
在总和中,您需要使用对象的别名。 见总和()在这里 ,如果MoneyIn
和MoneyOut
是int
,你必须使用此重载
修改:
Balance = Cust.Sum(bt.MoneyIn) - Cust.Sum(bt.MoneyOut)
对此:
Balance = Cust.Sum(x=>x.bt.MoneyIn) - Cust.Sum(x=>x.bt.MoneyOut)
和Name
的Cust
是分组的关键 :
select new
{
Name = Cust.Key,
Balance = Cust.Sum(x => x.bt.MoneyIn) - Cust.Sum(x => x.bt.MoneyOut)
};
完整查询:
var query = from c in db.Customers
join b in db.Banks on c.Id equals b.CustomerId
join bt in db.BankTransactions on b.Id equals bt.BankId
group new { bt.MoneyIn,bt.MoneyOut} by c.Name into Cust
select new
{
Name = Cust.Key,
Balance = Cust.Sum(x=>x.MoneyIn) - Cust.Sum(x=>x.MoneyOut)
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.