使用 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 个表

如何在 2 个谓词上对 2 个表进行 LINQ 左连接?

Linq to Entity 具有多个左外连接

Linq C#方法语法,连接3个表

在不同的列上使用 LINQ 连接三个表并在最后打印总和 [重复]

Laravel 连接 3 个表