2016-02-10 3 views
0

Скажем, у меня есть классРегистрация на условия с помощью методов Linq

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); 

Кто-нибудь знает, как это сделать?

ответ

2

Метод Join предназначен для equijoin - не произвольное условие.

Вы можете просто использовать 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) проще понять с помощью выражений запроса из-за прозрачных идентификаторов.

+0

Приходит, чтобы сохранить день, как всегда @jonskeet –

+0

Желаю, чтобы у меня был свой личный JonSkeet, чтобы помочь мне, когда мне это нужно lol – Savlon

Смежные вопросы