繁体   English   中英

使用sum和group by将sql查询转换为linq

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

在总和中,您需要使用对象的别名。 总和()在这里 ,如果MoneyInMoneyOutint ,你必须使用此重载

修改:

Balance = Cust.Sum(bt.MoneyIn) - Cust.Sum(bt.MoneyOut) 

对此:

Balance = Cust.Sum(x=>x.bt.MoneyIn) - Cust.Sum(x=>x.bt.MoneyOut) 

NameCust是分组的关键

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.

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