2016-03-22 5 views
0

Я хочу показать, на мой взгляд, три колонки:Asp.Net LINQ объединить три таблицы

====================================== 
UserName  | Email | Role Name 
======================================  
codelover12  [email protected] Student  
kimmy45634  [email protected] Teacher  
====================================== 

поэтому изначально я думал, что

я могу присоединиться к Id в AspNetUsers стол с UserId в AspNetUserRoles стол, а также присоединяйтесь к Id в AspNetRoles, поэтому я могу выяснить, кто имеет какую роль.

Я пытался так:

var model = from users in db.Users 
      join userRoles in db.AspNetUserRoles on users.Id equals roles.UserId 
      join role in db.Roles on role.Id equals userRoles.RoleId 
      select new { users.UserName, users.Email, role.Name }; 

, но понял, что я не могу получить доступ к AspNetUserRoles. Буду признателен за вашу помощь.

+0

Что конкретно вы подразумеваете под "не можете получить доступ к AspNetUserRoles"? Ваш запрос дает вам сообщение об ошибке? По крайней мере, это должно быть 'user.Id равно userRoles.UserId', хотя вместо этого вы должны использовать свойства навигации. – juharr

+0

это дает мне ошибку на db.AspNetUserRoles, говорящей, что ApplicationDbContext не содержит определения для 'AspNetUserRoles' – kkagill

+0

Я предполагаю, что это много-много таблиц, а EF не создает сущности для них. Вместо этого вы должны использовать свойства навигации. Что-то вроде 'от пользователя в db.Users от роли в user.Roles' – juharr

ответ

0

EF создать перекрестный стол AspNetUserRoles автоматически. Таким образом, вы можете использовать навигационные свойства или сделать что-л. Следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{  
    modelBuilder.Entity<AspNetUser>() 
     .HasMany(x => x.Roles) 
     .WithMany(x => x.AspNetUsers) 
    .Map(x => 
    { 
     x.ToTable("AspNetUserRoles"); // third table is named Cookbooks 
     x.MapLeftKey("AspNetUserId"); 
     x.MapRightKey("RoleId"); 
    }); 
} 
+0

спасибо за ваш ответ – kkagill

1

Ну, я понял.

Самого простой способ сделать это было добавить эту строку коды в IdentityModels.cs

public DbSet<IdentityUserRole> UserRoles { get; set; } 

, то теперь вы можете иметь доступ к AspNetUserRoles, и писать коды, как

var findRole = (from userRole in db.UserRoles 
       join role in db.Roles on 
       userRole.RoleId equals role.Id 
       where userRole.UserId == Id 
       select role.Name).ToList(); 

Надеется, что это может помочь другие, у кого есть подобные проблемы.

Смежные вопросы