c# - razor view MVC c# 中 2 个后代模型的 Foreach 循环

标签 c# asp.net-mvc entity-framework razor

假设我有 3 个模型:

Account;
Expense;
Profit;

费用利润模型链接到具有 FK Acount_Id 的帐户

现在我想要一个 View ,在其中显示每个帐户的 HTML 表及其自己的变动(利润和费用数据表中的行)。我希望它们按插入的日期排序,这是利润和费用表的一个字段。

如何在 View 中实现 Foreach?

类似这样的逻辑:

Foreach (var item in ( (AccountModel.Profit join AccountModel.Expense).orderedByDate Desc) {
... Do stuff...
}

帐户模型:

namespace dBudget.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Account
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Account()
        {
            this.Expenses = new HashSet<Expense>();
            this.Profits = new HashSet<Profit>();
            this.UserAccounts = new HashSet<UserAccount>();
        }

        public int Id { get; set; }
        public string Name { get; set; }
        public int User_Id { get; set; }
        public System.DateTime DateCreated { get; set; }
        public bool Active { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Expense> Expenses { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Profit> Profits { get; set; }
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<UserAccount> UserAccounts { get; set; }
    }
}

费用模型:

namespace dBudget.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Expense
    {
        public int Id { get; set; }
        public double Value { get; set; }
        public string Description { get; set; }
        public System.DateTime Date { get; set; }
        public Nullable<int> Loan_Id { get; set; }
        public int User_Id { get; set; }
        public int Account_Id { get; set; }
        public System.DateTime DateCreated { get; set; }

        public virtual Account Account { get; set; }
        public virtual Loan Loan { get; set; }
        public virtual User User { get; set; }
    }
}

盈利模式:

namespace dBudget.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Profit
    {
        public int Id { get; set; }
        public double Value { get; set; }
        public string Description { get; set; }
        public System.DateTime Date { get; set; }
        public Nullable<int> Loan_Id { get; set; }
        public int User_Id { get; set; }
        public int Account_Id { get; set; }
        public System.DateTime DateCreated { get; set; }

        public virtual Account Account { get; set; }
        public virtual Loan Loan { get; set; }
        public virtual User User { get; set; }
    }
}

最佳答案

根据评论,您希望将与帐户相关的所有费用和利润集中在一个地方(模型/ View 模型)。

假设您现有的类(class)是:

public class Account
{
    public int Id { get; set; } // or account number

    // your rest of the properties
    public decimal AmountBalance { get; set; }

}


public class Expense
{
    public int Id { get; set; }
    public int AccountId { get; set; } // Foreign key
    public string Details { get; set; }
    public decimal Amount { get; set; }
}

public class Profit
{
    public int Id { get; set; }
    public int AccountId { get; set; } // Foreign key
    public string Details { get; set; }
    public decimal Amount { get; set; }
}

我们为模型添加一个类,例如:

// Your view model
public class AccountModel
{
    public Account Account { get; set; }
    public List<Profit> Profits { get; set; }
    public List<Expense> Expenses { get; set; }
}

现在一些虚拟数据来填充现有的类:

var accounts = new List<Account>
    {
        new Account {Id = 1, AmountBalance = 110},
        new Account {Id = 2, AmountBalance = 120},
    };

var expenses = new List<Expense>
    {
        new Expense {Id = 1, AccountId = 1, Amount = 10},
        new Expense {Id = 2, AccountId = 1, Amount = 40},
        new Expense {Id = 3, AccountId = 2, Amount = 50},
    };

var profits = new List<Profit>
    {
        new Profit {Id = 1, AccountId = 1, Amount = 20},
        new Profit {Id = 2, AccountId = 2, Amount = 30},
        new Profit {Id = 3, AccountId = 2, Amount = 60},
    };

然后,我们按帐号/Id 形成利润费用

// Form groups of expenses by the account number / id. Each group will have all the expenses belonging to the same account number / id
var expenseGroupsByAccount = expenses.GroupBy(expense => expense.AccountId).ToList();

// Form groups of profits by the account number / id. Each group will have all the profits belonging to the same account number / id
var profitGroupsByAccount = profits.GroupBy(profit => profit.AccountId).ToList();

最后,我们填充模型

// Now we can populate the AccountModel, which is essentially an account and all expenses & profits associated with it. 
var accountModels = new List<AccountModel>();
foreach (Account account in accounts)
{
    var accountModel = new AccountModel
        {
            Account = account,
            Profits =
                profitGroupsByAccount.Where(profitsGroup => profitsGroup.Key == account.Id)
                                     .SelectMany(g => g)
                                     .ToList(),
            Expenses = expenseGroupsByAccount.Where(expenseGroup => expenseGroup.Key == account.Id)
                                             .SelectMany(g => g)
                                             .ToList()
        };
    accountModels.Add(accountModel);
}

关于c# - razor view MVC c# 中 2 个后代模型的 Foreach 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36934343/

相关文章:

c# - 使用 Linq 搜索

c# - UWP 将 child 转移到其他 parent 问题

asp.net-mvc - EF 4.5 Code First 复合键的 MVC 脚手架错误

c# - 在 app.config 中获取 ConfigurationElement parent

C# 将 FileStream.WriteLine 转换为 MemoryStream

asp.net-mvc - asp.net mvc 3 中 DataAnnotations 的行为是否发生了变化?

javascript - Uncaught ReferenceError : $ is not defined when loading bootstrap date time picker in mvc

entity-framework - 使用EF6连接到SQL Server

.net - 如何在连接字符串中设置 Entity framework 4 CommandTimeout?

c# - 如何确定 Expression<Func<T, object>> 是否对 EntityFramework .Include 有效