Say I have a class
Class Record
{
int Id
int StartDate
}
Class DBRecord
{
int Id
DateTime StartDate
DateTime EndDate
}
How could I join these using the linq methods syntax with a condition that the start date is between the dbrecords start and end date? I tried like this but no luck:
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);
Does anyone know how to do this?
The Join
method is for an equijoin - not an arbitrary condition.
You might want to just use SelectMany
to get a "full join" and then 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)
Or you could to an inner join based on just ID, and then filter:
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)
Note that both of these would be easier to understand using query expressions - almost every case where you've got two source sequences (calls to SelectMany
and Join
) are simpler to understand with query expressions due to transparent identifiers.
See more on this question at Stackoverflow