【问题标题】:How can I transform this SQL query to LINQ?如何将此 SQL 查询转换为 LINQ?
【发布时间】:2016-01-23 04:08:06
【问题描述】:

如何将此 SQL 查询转换为 LINQ?

SELECT eg.Name Name, sum(bi.PlannedAmount) Amount
FROM BudgetItem bi, Expense e, ExpenseGroup eg
WHERE Discriminator = 'ExpenseItem' AND
bi.ExpenseId = e.Id AND
e.ExpenseGroupId = eg.id AND
bi.MonthlyBudgetId = 1
GROUP BY eg.Name

到目前为止,我想出了这一行:

var result = context
            .ExpenseGroups
            .GroupBy(eg => eg.Id, (s) => new { Name = s.Name, Amount = s.Expenses.SelectMany(e => e.Items).Sum(i => i.PlannedAmount) })
            .ToList();

但我仍然无法弄清楚要使用什么表达式来添加“bi.MonthlyBudgetItem = 1”。

有人有想法吗?

编辑#1: 我忘了提及实体之间的关系。每个ExpenseGroup都有很多Expenses,每个Expense都有很多BudgetItems

所以,ExpenseGroup => 费用 => BudgetItems

编辑#2: 我正在使用实体框架,每个 ExpenseGroup 都有一个 Expense 对象的集合(每个 Expense 都有一个 ExpenseGroup 对象),每个 Expense 都有一个 BudgetItem 对象的集合(每个 BudgetItem 对象都有一个 Expense 对象)。

【问题讨论】:

    标签: c# sql linq entity-framework-6


    【解决方案1】:

    我想应该这样做:

    var result = context
            .ExpenseGroups
            .Where(x => x.Discriminator == 'ExpenseItem' && 
                x.bi.ExpenseId == e.Id && 
                x.e.ExpenseGroupId == eg.id &&
                x.bi.MonthlyBudgetId == 1)
            .GroupBy(eg => eg.Id, (s) => new { Name = s.Name, Amount = s.Expenses.SelectMany(e => e.Items).Sum(i => i.PlannedAmount) })
            .ToList();
    

    【讨论】:

      【解决方案2】:

      类似的东西...

      var result = (from g in context.ExpenseGroups
                    where g.Expense.BudgetItem.MonthlyBudgetId == 1
                    select g)
              .GroupBy(eg => eg.Id, (s) => new { Name = s.Name, Amount = s.Expenses.SelectMany(e => e.Items).Sum(i => i.PlannedAmount) })
              .ToList();
      

      var result = context.ExpenseGroups
                   .Where(g => g.Expense.BudgetItem.MonthlyBudgetId == 1)
                   .GroupBy(eg => eg.Id, (s) => new { Name = s.Name, Amount = s.Expenses.SelectMany(e => e.Items).Sum(i => i.PlannedAmount) })
              .ToList();
      

      【讨论】:

        【解决方案3】:

        您实际上是在您的 SQL 查询中执行inner join,因此在您的 linq 查询中也执行类似的操作。这应该有效:-

        var result = from bi in context.BudgetItem
                     join e in context.Expense 
                     on bi.ExpenseId equals e.Id 
                     where bi.MonthlyBudgetId == 1
                     join eg in ExpenseGroup 
                     on e.ExpenseGroupId equals eg.id 
                     group new { bi, eg } by eg.Name into g
                     select new 
                           {
                                 Name = g.Key,
                                 Amount = g.Sum(x => x.bi.PlannedAmount)
                           };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          相关资源
          最近更新 更多