如何使用.Concat为Union All查询选择不同的字段

时间:2018-06-21 19:12:25

标签: linq linq-to-sql linq-to-entities

我正在做一些初步工作,以便从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,则会引发上述错误。我想不使用存储过程来执行此操作。有什么想法吗?

1 个答案:

答案 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是相同的基础类型)