1

说我有课

Class Record
{
   int Id
   int StartDate
}

Class DBRecord
{
   int Id
   DateTime StartDate
   DateTime EndDate
}

我如何使用 linq 方法语法加入这些,条件是开始日期在 dbrecords 开始日期和结束日期之间?我试过这样但没有运气:

this.Records().Join(context.DBRecords,
          x=> new { x.Id, x.StartDate},
         (x, y) => { x.Id == y.Id, x.StartDate > y.StartDate && x.startDate < x.endDate  },
         (x,y) => y);

有谁知道如何做到这一点?

4

1 回答 1

2

Join方法适用于等值连接 - 不是任意条件。

您可能只想使用SelectMany获得“完全加入”,然后Where

this.Records()
    .SelectMany(_ => context.DBRecords, (x, y) => new { x, y })
    .Where(z => { z.x.Id == z.y.Id &&
                  z.x.StartDate > z.y.StartDate && 
                  z.x.StartDate < z.y.EndDate  })
    .Select(z => z.y)

或者您可以仅基于 ID 进行内部连接,然后过滤:

this.Records()
    .Join(context.DBRecords, x => x.Id, y => y.Id, (x, y) => new {x, y})
    .Where(z => { z.x.StartDate > z.y.StartDate && 
                  z.x.StartDate < z.y.EndDate  })
    .Select(z => z.y)

请注意,使用查询表达式会更容易理解这两种情况 -由于透明标识符,几乎所有有两个源序列(调用SelectMany和)的情况都更容易使用查询表达式来理解。Join

于 2016-02-10T17:58:33.883 回答