代码之家  ›  专栏  ›  技术社区  ›  silencedogood

如何使用.concat为union all查询选择不同的字段

  •  0
  • silencedogood  · 技术社区  · 6 年前

    我正在做一些准备工作,让MVC中的WebAPI控制器准备好数据消耗。i_m使用的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查询中,它将抛出前面提到的错误。我希望不使用存储过程来执行此操作。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jonathan    6 年前

    不要放入两个匿名类型,而是放入同一个ViewModel和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
    }
    

    (假设状态和部门工作是相同的基础类型)