Присоединяйтесь при условии с методами 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);

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

1 ответ

Решение

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)

Или вы можете использовать внутреннее соединение, основанное только на идентификаторе, и затем отфильтровать:

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

Другие вопросы по тегам