我有三个简单的表——用户组、员工和称呼。都有 ID、Name/Desc 和 Active 列。用户组也被分配了一个可选的员工 ID,而员工被分配了一个非可选的称呼 ID。我希望查询这些表以返回所有活动用户组的完整列表,以及他们相关的工作人员(是任何),以及他们的相关称呼。
一个有效的 SQL 查询如下:
SELECT grp.ID, grp.Desc, grp.Active, sub.Name, sub.Desc
FROM Tbl_UserGroup AS grp
LEFT JOIN (
SELECT st.ID, st.Name, sal.Desc
FROM PrmTbl_Staff AS st
LEFT JOIN PrmTbl_Salutation AS sal ON st.SalutationID = sal.ID
WHERE 1
) AS sub ON grp.StaffID = sub.ID
WHERE grp.Active = TRUE
ORDER BY grp.ID DESC
我有一个 ViewModel 如下:
public class StaffUserGroup
{
public int GroupID { get; set; }
public string GroupDesc { get; set; }
public bool GroupActive { get; set; }
public int? StaffID { get; set; }
public string StaffName { get; set; }
public string SalutationName { get; set; }
public List<PrmTbl_Staff> StaffsList { get; set; }
}
并尝试 LINQ 查询:
IEnumerable<Tbl_UserGroup> grpsQuery;
grpsQuery = from grp in db.Tbl_UserGroups
join sub in(
from st in db.PrmTbl_Staffs
join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
select new { StID = st.ID, st.Name, Salt = sal.Desc }
) on grp.StaffID equals sub.StID
where grp.Active = true
orderby grp.ID descending
select new { grp.ID, grp.Desc, grp.Active, sub.Name, sub.Salt, sub.StID };
在我的控制器中加载:
var viewModel = grpsQuery.Select(group =>
new StaffUserGroup
{
GroupID = group.GroupID,
GroupDesc = group.GroupDesc,
GroupActive = group.GroupActive,
StaffID = group.StaffID,
StaffName = group.StaffName,
SalutationName = group.SalutationName,
StaffsList = rtrnStaff
}
);
请注意,智能感知在子查询和主查询之间标记了同名的列,因此我引入了一些别名。我还希望将所有可用员工的下拉列表传递给视图,因此视图模型中的列表。
我在 LINQ 语句中的 select 调用中遇到错误:Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#4>' to '<...StaffUserGroup> An explicit conversion exists. Are you missing a cast?
我不知道
- 当我可以直接向控制器查询我需要的数据时,为什么我需要一个 ViewModel
- 然后 ViewModel 类实际上对从查询中检索到的数据做了什么——它会过滤吗?从中构造一个对象?从我在 PHP 和 MySQL 的背景来看,有什么比较?
- 如何从表中查询特定列。我使用
select new {}
,因为我假设这是等效的? - 为什么上面的 LINQ 语句不起作用。
如果需要,我可以发布模型、视图或控制器。非常感谢任何帮助和建议!