【问题标题】:Entity Framework getting a running total from columns实体框架从列中获取运行总计
【发布时间】:2020-09-13 04:26:20
【问题描述】:

这可能以前被问过,但我正在努力寻找答案。我有下面的代码,试图得到一个运行总数。

这不是我以前见过的错误,并且对于它的实际含义或如何修复它感到困惑,并尽可能将其保留在一个查询中。但是,我们愿意接受更好的方法来做到这一点。

我已在发生错误的位置以及 Visual Studio 中的错误内容添加了注释。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;

    class VMAccountWindow : BaseViewModel
    {

        public VMAccount()
        {
            using (DBContext db = new DBContext())
            {
                decimal currentTotal = 0;

                var tl = db.Transaction
                    .OrderByDescending(
                        p => p.TransactionDate
                    )
                    .Select(p => new TransactionList
                    {
                        AccountId = p.AccountId,
                        TransactionDate = p.TransactionDate,
                        Deposit = p.TransCode == "Deposit" ? p.TransactionAmount.ToString() : "",
                        Withdrawal = p.TransCode == "Deposit" ? "" : p.TransactionAmount.ToString(),
                        Notes = p.Notes,
                        // Following gives an error about Expression tree may not contain an assignment operator
                        AccountBalance = currentTotal += p.TransCode == "Deposit" ? p.TransactionAmount : -p.TransactionAmount
                    })
                .Where(o => o.AccountId == 1)
                .ToList();
            }
        }
    }

    public class TransactionList
    {
        public int AccountId { get; set; }
        public string TransactionDate { get; set; }
        public string Deposit { get; set; }
        public string Withdrawal { get; set; }
        public string Notes { get; set; }
        public decimal AccountBalance { get; set; }
    }

任何帮助将不胜感激。

【问题讨论】:

  • 如果您尝试选择匿名类型并仅选择 currenttotal。还是错误?
  • 是的,就像链接中的here 一样,无论如何,我在使用 EF6 时总是会遇到同样的错误。

标签: c# wpf entity-framework-6


【解决方案1】:

解决方案是先将结果变成一个列表,然后进行第二次选择,我没有看到这一点,因为我所做的搜索只显示了获取数据。没有展示如何。

由于这可能会绊倒其他新开发人员,因此我粘贴了下面的工作示例,这是所有尝试提供帮助的人提出的所有建议的结果。

var tl = db.Transaction
    .Where(o => o.AccountId == 1)
    .OrderBy(p => p.TransactionDate)
    .ToList()
    .Select(i =>
            {
                currentTotal += p.TransCode == "Deposit" ? p.TransactionAmount : 0;
                return new TransactionList
                {
                    ToAccountId = i.ToAccountId,
                    TransactionDate = i.TransactionDate,
                    AccountBalance = currentTotal
                };
            }
    )
    .ToList();

不幸的是,我不知道为什么必须先将其转换为列表,然后进行选择,所以如果有人能指出原因,如果知道的人能解释那部分,将不胜感激.

【讨论】:

  • 强烈建议在ToList 之前执行Where(这是问题,但不是这个答案),否则您将加载每次整桌。
  • 你是对的,我忘了把它放到解决方案中,因为我使用的最后一个 where 子句很复杂。已进行调整以反映原始问题。
【解决方案2】:

您在最初分配 currentTotal

后使用 +=

将其更改为 +,如下所示:

AccountBalance = currentTotal + p.TransCode == "Deposit" ? p.TransactionAmount : -p.TransactionAmount                    

【讨论】:

  • 但这并不是一个累计。
  • 你要么想看看使用 .Sum() 要么 .ForEach()
  • 那么实体框架没有办法做到这一点吗?可以用普通的 SQL 来完成,我原以为你可以用 Entity Framework 来完成,
  • 对不起,我应该说,这些是您可以与 EF 一起使用的 Linq 方法。查看this SO post
  • 对不起,这不是一回事。在 SQL 中,我可以获得事务的运行总数。喜欢这篇文章link 我正在尝试对实体框架做同样的事情。从我可以告诉你展示的帖子中,得到一个总数并存储它。和我想做的不一样。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多