У меня есть две таблицы, которые мне нужно объединить для представления моей страницы Razor. Первая таблица под названием «Учетная запись» содержит запись Учетной записи со статусом int. Вторая таблица под названием «AccountStatuses» содержит возможные статусы учетной записи. Scaffolding создал следующий код в Account \ Index.cshtml.cs

    public IList<Account> Account { get;set; }

    public async Task OnGetAsync()
    {
        Account = await _context.Account.ToListAsync();
    }

Таблица Account содержит столбец «Статус», который соответствует столбцу «Значение» в таблице AccountStatus. Я хочу присоединиться к ним и вернуть столбец «StatusString» из таблицы AccountStatus в представление.

1
MikeK 17 Фев 2018 в 08:13

1 ответ

Лучший ответ

Вам не нужно объединять две таблицы, чтобы получить значения. Если вы правильно настроили свои модели, вы можете позволить Entity Framework сделать всю работу за вас. Я приведу вам пример того, как я буду создавать модели. Прежде всего, у нас есть две модели:

public class Account
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AccountID { get; set; }

    public string AccountName { get; set; }

    public int AccountStatusID { get; set; }
    [ForeignKey("AccountStatusID")]
    public virtual AccountStatus AccountStatus { get; set; }
}


public class AccountStatus
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AccountStatusID { get; set; }

    public string AccountStatusName { get; set; }

    public virtual ICollection<Account> Accounts { get; set; }
}

Модель Account имеет свойство AccountStatusID, которое будет содержать идентификатор статуса. Мы также определяем виртуальное свойство для модели AccountStatus. Это будет автоматически загружено EntityFramework для нас, когда мы запросим его у Entity Framework.

Мы делаем нечто подобное для модели AccountStatus, но в этой модели у нас будет виртуальная коллекция моделей Account.

Теперь нам нужно определить наш класс ApplicationDbContext, который может быть следующим:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
    }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<AccountStatus> AccountStatuses { get; set; }
}

Теперь мы можем выполнять следующие запросы:

// Get the account by id
Account account1 = await _context.Accounts.SingleOrDefaultAsync(m => m.AccountID == id);

// Get the account by id including the Account status
Account account2 = await _context.Accounts.Include(m => m.AccountStatus).SingleOrDefaultAsync(m => m.AccountID == id);
// account2.AccountStatus contains the AccountStatus
string AccountStatusName = account2.AccountStatus.AccountStatusName;


// Get teh account status by id
AccountStatus AccountStatus1 = await _context.AccountStatuses.SingleOrDefaultAsync(m => m.AccountStatusID == id);

// Get the account status by id include the accounts
AccountStatus AccountStatus2 = await _context.AccountStatuses.Include(m => m.Accounts).SingleOrDefaultAsync(m => m.AccountStatusID == id);
// AccountStatus2.Accounts contain all the accounts which has be set to be equal to the current account status
foreach (var account in AccountStatus2.Accounts)
{
    string AccountName = account.AccountName;
}

Надеюсь, это вам поможет.

0
pitaridis 18 Фев 2018 в 02:46