c# - 使用 sum 和 group by 将 Sql Query 转换为 linq

标签 c# sql-server linq linq-to-sql linq-to-entities

我是 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.

此外,您按错误的 Prop 进行分组。如果你想将 sum 应用到你的 BankTransactions 你需要像这样分组:

group bt by c.Name into 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) };

关于c# - 使用 sum 和 group by 将 Sql Query 转换为 linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906903/

相关文章:

c# - 从列表中选择所有字符串的最快方法

c# - 具体化查询结果不支持此方法

c# - 如何将此同步方法转换为返回任务的方法?

sql-server - 在服务器中创建数据库后建立新的 SQL 连接

sql-server - 使用 SQL Server 扩展 SignalR - 我们多久可以清除一次数据?

java - 通过 Java 代码连接到 MicroSoft Sql Server 2012 时出现连接错误

c# - 需要模拟自定义类以进行单元测试

c# - ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter 和 UITypeEditor

c# - 带 ID 的 LinkBut​​ton 不会导致回发,它不会

LINQ 性能