Linq连接表和选择列

时间:2017-12-22 16:46:53

标签: c# linq linq-to-sql

我有一个用户表:

Id        Name     PermissionId    ActiveId
1         John                1           1
2        Henry                2           2

许可表

Id     Name
1       User
2       SAdmin

Active Table

Id     Name
1      Enable
2      Disable

然后我的实体为:

 public class Users
 {
    public int Id { get; set; }
    public string Name { get; set; }
    public int PermissionId { get; set; }
    public int ActiveId { get; set; }
 }
 public class Permission 
 {
    public int Id { get; set; }
    public string Name { get; set; }    
 }
 public class Active 
 {
    public int Id { get; set; }
    public string Name { get; set; }
 }

在我的存储库中,我想加入这些表并获取所有用户数据,因此我使用linq作为:

public IEnumerable<Users> GetUserData()
{

 var results = from user in _db.users
          join permission in _db.permission on user.PermissionId equals 
 permission.Id      
      join active in _db.active on user.ActiveId equals active.Id;                  

 return results.ToList();
}

如何从表格中选择某些列,我还尝试使用以下内容:

var results = from user in _db.users
          join permission in _db.permission on user.PermissionId equals 
 permission.Id      
         join active in _db.active on user.ActiveId equals active.Id
          select new {Id = user.id, Name = user.name, Permission = 
permission.Name, Active = active.Name};

Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous 
type: int id, string name, string permission, string active>>' to 
'System.Collections.Generic.IEnumerable<Users>'

谢谢,

2 个答案:

答案 0 :(得分:0)

您很可能会返回匿名类型,但您的方法需要IEnumerable of Users

public IEnumerable<Users> GetUserData()

如果您需要以其他形状返回数据,您只需要为该返回类型创建一个专用类。

如果新形状与User具有几乎相同的字段,并且它应该对您的项目有意义,请使新类继承自User并使用新字段扩展它

确保你记得favor composition over inheritance但是

答案 1 :(得分:0)

方法GetUserData期望IEnumerable of Users类型,并且join表达式返回IEnumerable匿名类型,并且编译器无法识别它是相同类型的用户(即使它具有相同的属性):&& #39;问题所在。在连接之后,您必须使用Users类型转换结果,以便创建正确的和期望的返回类型。您可以在下面找到一个示例:

var results = from user in _db.users 
join permission in _db.permission 

on user.PermissionId equals permission.Id 
join active in _db.active on user.ActiveId equals active.Id 
select new Users{Id = user.id, Name = user.name, 
Permission = permission.Name, Active = active.Name};`

希望它会对你有所帮助。