使用 linq 连接具有不同结构的 2 个表
Posted
技术标签:
【中文标题】使用 linq 连接具有不同结构的 2 个表【英文标题】:Concat 2 tables with different structure using linq 【发布时间】:2012-01-18 07:27:44 【问题描述】:我想合并 2 个表格并在一个数据网格中显示所有表格:
tblReservation(ID、StartTime、EndTime、SchoolID、AccomodationID) tblMeeting(ID、开始时间、结束时间、主题、位置)在数据网格中,我有 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
如何将另一个表添加到此循环中?
【问题讨论】:
当你说数学和不同时,你是指类型还是值? 我说不一样,因为学校和住宿都用他们的 ID 保存 【参考方案1】:在选择中你可以做类似的事情
select new oReservation.StartTime, oRservation.EndTime ;
然后使用 Union() 扩展方法传递另一个查询将它们放在一起 示例见第二个框here
【讨论】:
【参考方案2】:假设您有以下实体;
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 作为结果类型,如果您愿意,可以根据需要创建新类型。
【讨论】:
以上是关于使用 linq 连接具有不同结构的 2 个表的主要内容,如果未能解决你的问题,请参考以下文章
EF linq/lambdas 使用 concat 连接 2 个表