我在EF 6.1中有两个表,我需要帮助加入它们来填充 OverDueEquipVM
,当我返回它时,groupBy抛出返回列表说它不是IEnumerable类型 .
Table 1:
LaptopsTable
包含 Employee Id
& ManagerId
& DatesCheckedOut
EqipType
Table 1:
EmployeeTable
包含 Employee Id
, FirstName
, LastName
, Position
员工/经理 .
我可以查询 Table 1:
所有项目逾期(超过一周),但是我的结果有 EmpID
& MgrID
并且将一个分组的员工列表返回到视图集会抛出一个错误,它不是IEnumrable, how do I join this so that I can display the First + Last names as well? and group it by the emp names in descending order of overduedate 即在VM中添加名字,姓氏同样 .
db.LaptopsTable.Where(x => x.EmployeeId == userId) // loggedin user
.Where(x => x.date >= checkOutDate.Date // check overdue?
&& x.date < todaysDate.Date)
.OrderByDescending(x => checkOutDate.Date)
.GroupBy(x => x.EmployeeId)
.TheOrderBy(x => x.EqipType).ToList();
public class OverDueEquipVM
{
public int EmployeeId;
public int ManagerId;
public string EmployeeName; // First + last
public string ManagerName;
public date CheckOutDate;
public string EqiupType; // phone laptop etc
public int EmployeeId;
}
1 回答
你提到的错误很简单:GroupBy的返回值是什么,ThenBy的输入值是多少?
关于GroupBy中输出的顺序没有指定(因此也不保证),所以我认为在分组之前订购任何东西都没用 . 在分组过程之后你应该OrderBy和ThenBy .
关于您的OverDueEquipVM .
看来你想要来自
Employee
的所有Laptops
的列表与给定的userId
已过期 . 除了一些Laptop
信息之外,您还需要FirstName
和拥有Laptop
的Employee
的LastName
以及histManagerId
.由于你的GroupBy语句,似乎
Employee
和_1737450之间存在一对多的关系:每个Employee
都有零个或多个Laptops
,而每个Laptop
都属于使用EmployeeId的一个
Employee` .我认为
Manager
和Laptop
之间也存在一对多的关系:每个Manager
管理零个或多个Laptops
,并且每个Laptop
由一个Manager
管理,使用外键ManagerId
因为你的短语:“员工/经理”我不确定每个员工是否都有经理 . 我假设你想要最终结果的笔记本电脑经理 .
如果您根据Entity Framework One-To-Many conventions配置您的Employee / Laptop / Manager课程,您可能会遇到以下情况:
现在,给定userId,checkoutDate和todaysDate,您希望此用户拥有的所有笔记本电脑都具有checkOutDate和todaysDate之间的日期 . 每台笔记本电脑都需要这台笔记本电脑所有者的名字和姓氏,以及这台笔记本电脑的管理员的名字和姓氏 .
有几个问题:
您不希望使用checkoutDate和todaysDate的DateTime值,而是使用Date属性 . 通常你会使用DateTime.Date . 但Ling不支持IQueryable中的此功能 .
最简单的方法是在linq语句中使用之前提取日期:
另一种方法是使用DbFunctions.TruncateTime
另一个问题是您想要连接Employee和Manager的FristName和LastName . 实体框架不支持String.Concat . 最好的方法是记住OverDueEquipm中的FirstName和LastName,并添加一个FullName属性:
好消息是,如果您想更改名称的想法,例如添加中间名,或想要使用缩写或其他更改,您不必更改您的员工或经理 .
如果你真的不想引入一个Name类,你将不得不进行串联AsEnumerable .
完成此操作后,您的查询将很容易: