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连接表和选择列的主要内容,如果未能解决你的问题,请参考以下文章