我正在使用Code First Entity Framework。
我使用以下简单类:
public class Users
{
public ICollection<Projects> Projects{get;set;}
}
public class Projects
{
public ICollection<Users> Users{get;set;}
}
我正在使用linq进行数据检索。执行以下查询时:(请注意,lstProjects
是List<Project>
)
var lstUsers = (from users in lstProjects
where users.ProjectId == pId
select users.Users).ToList();
我有一个List<Users>
对象,想要用项目填充此列表。像,
var lstUsersToDisplay = new List<Users>();
lstUsersToDisplay = (List<Users>)lstUsers; //This can't be cast.
将ICollection<T>
转换为List<T>
的方法是什么?
其次,我有List<Users>
并希望将其转换为ICollection<Users>
如何实现此目标?
编辑:
场景,更清楚的是
所有Projects
都加载到lstProjects
中,我们需要选择映射到特定项目的Users
。这些用户也包含在Projects
内作为集合。每个Project
都有Users collection
,如果我将lstProjects分解为:
lstProjects --> [0]-->//other Properties
ICollection[Users]-->[0]//Contains User class Properties
[1]....
[1] ... same procedure
希望它能清除场景
答案 0 :(得分:5)
如果您的查询真的这个:
var lstUsers = (from users in lstProjects
where users.ProjectId == pId
select users.Users).ToList();
那相当于:
List<ICollection<Users>> lstUsers = (from users in lstProjects
where users.ProjectId == pId
select users.Users).ToList();
如果您正在尝试从单个项目中获取使用列表,我会将其写为:
var lstUsers = lstProjects.Single(project => project.ProjectId == pId)
.Users
.ToList();
如果可能有多个具有相同ProjectId
的项目,您希望展平用户。例如:
var lstUsers = lstProjects.Where(project => project.ProjectId == pId)
.SelectMany(project => project.Users)
.ToList();
或者在查询表达式语法中:
var lstUsers = (from project in lstProjects
where project.ProjectId == pId
from user in project.Users
select user).ToList();
请注意我的范围变量名为project
,因为它指的是项目,不是用户。命名很重要 - 注意它。我还会将Projects
和Users
类型重命名为Project
和User
,假设每个类型实际上只是代表一个实体。
答案 1 :(得分:0)
将
ICollection<T>
转换为List<T>
的方法是什么?
最通用的方法是使用ToList
:
lstUsersToDisplay = lstUsers.ToList();
但看起来你真的有一个List<ICollection<Users>>
。 To&#34; flatten&#34;该列表使用SelectMany
:
lstUsersToDisplay = lstUsers.SelectMany(c => c).ToList();
我有
List<Users>
并希望将其转换为ICollection<Users>
如何实现此目标?
List<Users>
已 ICollection<Users>
- 无需转换。
答案 2 :(得分:0)
lstUsers
不是List<User>
。它是List<ICollection<User>>
。您将每个项目映射到用户的序列,而不是单个用户。要将集合集合展平为只使用SelectMany
内部项目的集合,或者在查询语法中,您可以像这样写出您的查询:
var lstUsers = (from project in lstProjects
where project.ProjectId == pId
from user in project.Users
select user).ToList();
现在 List<User>
有一个lstUsers
。您可以按原样分配给List<User>
或ICollection<User>
答案 3 :(得分:0)
using System.Linq; //include extension method OfType<> for ICollection
...
List<Projects> userList = lstUsers.OfType<Projects>().ToList();