如何在没有定义的情况下查询EF中的联结表(性能问题)

时间:2013-11-19 12:29:43

标签: c# sql linq entity-framework many-to-many

经典的User-UserRole-Role示例

UserProfile 类:

public class UserProfile
{
    public int Id { get; set; }
    public String UserName { get; set; }
    public virtual List<Role> Roles { get; set; }
}

角色类:

public class Role
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<UserProfile> Users { get; set; }
}

使用其他FluentAPI映射:

modelBuilder.Entity<Role>()
    .HasMany(p => p.Users).WithMany(u => u.Roles)
    .Map(m => 
        m.MapLeftKey("RoleId").MapRightKey("UserId").ToTable("UserInRole"));

实体框架代码首先生成数据库表UserProfileRoleUserInRoleUserInRole表仅包含RoleIdUserId个密钥。

问题/需要:我需要一个与其角色配对的用户列表,但仅限于特定的用户和角色列表。

我通过首先获取用户然后获得他们的角色来解决这个问题,但似乎性能要低得多(因为它似乎会多次往返DBMS)。

在SQL中,我会这样做:

select u.UserName, r.Name from UserInRole as ur
left outer join UserProfile as u on ur.UserId = u.Id 
left outer join Role as r on ur.RoleId = r.Id
where u.Id in (1, 2, 3) and r.Id in (1, 2, 3, 4, 5)

如果可能,我该如何在EntityFramework中执行此操作?请注意,我没有在Code First中映射联结表UserInRole)无我试过的LINQ查询从联结表生成了两个左外连接,据我所知,这将是最快的方法。如果我错了,请纠正我。

0 个答案:

没有答案