Linq连接表和选择列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linq连接表和选择列相关的知识,希望对你有一定的参考价值。

我有一个用户表:

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>'

谢谢,

答案

很可能你正在返回匿名类型,但你的方法需要一个IEnumerable的用户

public IEnumerable<Users> GetUserData()

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

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

确保你记得favor composition over inheritance

另一答案

方法GetUserData期望IEnumerable为Users类型,并且join表达式返回IEnumerable匿名类型,并且编译器无法识别它是同一类型的用户(即使它具有相同的属性):这就是问题所在。在连接之后,您必须使用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};`

希望它会对你有所帮助。

以上是关于Linq连接表和选择列的主要内容,如果未能解决你的问题,请参考以下文章

Linq 连接表并创建动态列错误

使用 LINQ 从选择中排除列

Linq:在数据表列中选择值

C# 使用 Linq 连接具有 2 个相同列的 2 个表

为啥hibernate会创建一个连接表和一个连接列?

将静态列添加到动态 LINQ 查询