我正在做一些初步工作,以便从MVC中的webAPI控制器准备好数据消耗。我正在使用linq查询,该查询模仿使用两个联接的联合查询。但是,我需要select语句在联合的每一侧要求一个不同的字段。当我运行查询时,这在SSMS中工作正常,但是当我在linq中创建查询时,它将不允许字段不同。它给出一个错误,指出每个匿名类型都需要相同类型的接收者。这是指通过选择新{}创建的两个匿名类型。这是两个查询。
在SQL中:
Select m.Last_Name, first_name, m.dc_number, Dept_Job as JobOrStatus FROM
Master_Roster m
INNER JOIN Class_Assignment a on m.dc_number = a.dc_number
where a.subject_am = 'y1'
AND Start_Date_AM <= '1/31/18'
UNION ALL
Select m.Last_Name, first_name, m.dc_number, status_am FROM Master_Roster m
INNER JOIN Attend_am_y1 at on m.dc_number = at.dc_number
where at.class_date_am >= '1/1/18'
AND at.class_date_am <= '1/31/18'
ORDER BY Last_Name
在linq中:
(from m in db.Master_Roster
join c in db.Class_Assignment
on m.dc_number equals c.dc_number
orderby m.Last_Name
where c.Subject_AM == "y1"
select new { m.dc_number, m.Last_Name, m.First_Name }).Concat(
from m in db.Master_Roster
join a in db.attend_am_y1 on m.dc_number equals a.dc_number
orderby m.Last_Name
where a.class_date_am >= date1 &&
a.class_date_am <= date2
select new { m.dc_number, m.Last_Name, m.First_Name });
如果我要在linq查询中添加dept_job和status_am,则会引发上述错误。我想不使用存储过程来执行此操作。有什么想法吗?
答案 0 :(得分:0)
将相同的viewmodel和concat放入2个匿名类型中,而不是将它们放入。例如:
Internal Class ConcatViewModel{
public int DcNumber {get;set;}
public string LastName {get;set;)
// etc...
}
然后:
select new ConcatViewModel{
DcNumber = m.dc_number,
LastName = m.Last_Name,
FirstName = m.First_Name,
Status = m.Dept_Job
}
和
select new ConcatViewModel{
DcNumber = m.dc_number,
LastName = m.Last_Name,
FirstName = m.First_Name,
Status = m.status_am
}
(假设status_am和Dept_Job是相同的基础类型)