使用 Linq 方法按条件加入
Join on Condition With Linq Methods
说我有一个 class
Class Record
{
int Id
int StartDate
}
Class DBRecord
{
int Id
DateTime StartDate
DateTime EndDate
}
如果开始日期介于 dbrecords 开始日期和结束日期之间,我如何使用 linq 方法语法加入这些?我试过这样但没有运气:
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);
有人知道怎么做吗?
Join
方法用于等值连接 - 不是任意条件。
您可能只想使用 SelectMany
获得 "full join" 然后 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
)的情况都更易于理解由于透明标识符的查询表达式。
说我有一个 class
Class Record
{
int Id
int StartDate
}
Class DBRecord
{
int Id
DateTime StartDate
DateTime EndDate
}
如果开始日期介于 dbrecords 开始日期和结束日期之间,我如何使用 linq 方法语法加入这些?我试过这样但没有运气:
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);
有人知道怎么做吗?
Join
方法用于等值连接 - 不是任意条件。
您可能只想使用 SelectMany
获得 "full join" 然后 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
)的情况都更易于理解由于透明标识符的查询表达式。