使用linq的Concat 2表具有不同的结构

时间:2011-12-12 09:08:35

标签: c# linq union concat

我想联合2个表并在数据网格中显示所有内容:

  • tblReservation(ID,StartTime,EndTime,SchoolID,AccomodationID)
  • tblMeeting(ID,StartTime,EndTime,Subject,Location)

在datagrid中,我有2个匹配的列(StartTime,EndTime)和2个不同的列。我仍然要联合这两个表并为学校/主题设置第3列,为住宿/位置设置第4列。

在PHP中,我知道您可以使用

为您获得的字段设置名称
SELECT x AS name

但我对LINQ语法不是很熟悉。

在这里,我从月份日历中选择的日期开始从tblReservation获取数据:

var vReservation = (from oReservation in clsApplication._oDBConnection.tblReservations
    where oReservation.StartTime.Value.Date >= mcCalendar.SelectionRange.Start.Date
    && oReservation.StartTime.Value.Date < cCalendar.SelectionRange.Start.Date.AddHours(24)
    orderby oReservation.StartTime ascending
    select oReservation);

foreach (var oReservation in vReservation)
{
    build the datagrid
}

如何将其他表添加到此循环中?

2 个答案:

答案 0 :(得分:0)

在选择中您可以执行类似

的操作
select new { oReservation.StartTime, oRservation.EndTime };

然后使用Union()扩展方法传递其他查询以将它们组合在一起 请参阅第二个方框here以获取示例

答案 1 :(得分:0)

假设您具有以下实体;

public class tblReservation
{
    public tblReservation(int id, DateTime startTime, DateTime endTime, int schoolID, int accomodationID)
    {
    ID = id;
    StartTime = startTime;
    EndTime = endTime;
    SchoolID = schoolID;
    AccomodationID = accomodationID;
    }
    public int ID { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public int SchoolID { get; set; }
    public int AccomodationID { get; set; }
}
public class tblMeeting
{
    public tblMeeting(int id, DateTime startTime, DateTime endTime, string subject, string location)
    {
    ID = id;
    StartTime = startTime;
    EndTime = endTime;
    Subject = subject;
    Location = location;
    }
    public int ID { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
    public string Subject { get; set; }
    public string Location { get; set; }
}

我用如下所示的伪数据填充了这些实体;

 var tblReservations = new List<tblReservation>() { new tblReservation(1,DateTime.MinValue, DateTime.MinValue.AddHours(1),1,1), new tblReservation(2, DateTime.MinValue, DateTime.MinValue.AddHours(2), 2, 3) };
        var tblMeetings = new List<tblMeeting>() { new tblMeeting(1, DateTime.MinValue, DateTime.MinValue.AddHours(1),"subject1","location1"), new tblMeeting(2, DateTime.MinValue, DateTime.MinValue.AddHours(2), "subject2", "location2") } ;

随后的LINQ将根据需要提供结果。

var result = tblReservations.Join(tblMeetings, x => string.Concat(x.StartTime,x.EndTime), y => string.Concat(y.StartTime,y.EndTime), (x, y) => new { x, y })
            .Select(m => new tblMeeting(m.x.ID, m.x.StartTime, m.x.EndTime, string.Concat(m.x.SchoolID, "/", m.y.Subject), string.Concat(m.x.AccomodationID, "/", m.y.Location)));

我已经使用 tblMeeting 作为结果类型,如果您愿意,可以根据需要创建一个新类型。