首页 > 解决方案 > 如何使用 .Concat 为 Union All 查询选择不同的字段

问题描述

我正在做一些初步工作,以便从 MVC 中的 webAPI 控制器准备好数据消耗。我正在使用一个 linq 查询,它模仿一个使用两个连接的联合查询。但是,我需要 select 语句在联合的每一侧要求不同的字段。当我运行查询时,这在 SSMS 中运行良好,但是当我在 linq 中创建查询时,它不允许字段不同。它给出了一个错误,指出每个匿名类型都需要一个相同类型的接收者。这是指通过 select new { } 创建的两个匿名类型……这是两个查询。

在 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 });

如果我将 dept_job 和 status_am 添加到 linq 查询,则会引发上述错误。我想在不使用存储过程的情况下做到这一点。有任何想法吗?

标签: linqlinq-to-sqllinq-to-entities

解决方案


不要放入 2 个匿名类型,而是放入相同的视图模型和 concat。例如:

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 是相同的底层类型)


推荐阅读