LINQ - Как запросить диапазон дат вступления в силу, который имеет только даты начала - PullRequest
2 голосов
/ 17 апреля 2010

Я использую C # 3.5 и EntityFramework. У меня есть список элементов в базе данных, которые содержат процентные ставки. К сожалению, этот список содержит только дату начала действия. Мне нужно запросить этот список для всех элементов в диапазоне.

Тем не менее, я не вижу способа сделать это, не запросив базу данных дважды. (Хотя мне интересно, если отложенное выполнение с EntityFramework делает только один вызов.) Несмотря на это, мне интересно, могу ли я сделать это, не используя мой контекст дважды.

internal IQueryable<Interest> GetInterests(DateTime startDate, DateTime endDate)  {
    var FirstDate = Context.All().Where(x => x.START_DATE < startDate).Max(x => x.START_DATE);
    IQueryable<Interest> listOfItems = Context.All().Where(x => x.START_DATE >= FirstDate && x.START_DATE <= endDate);
    return listOfItems;
}

Ответы [ 2 ]

3 голосов
/ 17 апреля 2010

Если вы можете использовать запрос LINQ, вы можете использовать let для этого:

(from c in dbContext.Table
let firstdate = dbContext.Table.Max(i => c.StartDate < startDate)
where c.StartDate >= firstdate
and c.StartDate <= enddate
select c)

Я не уверен, что макс будет работать таким образом, поэтому вам, возможно, придется сделать следующее:

(from c in dbContext.Table
let firstdate = dbContext.Table.Select(i => i.StartDate).Max(i => c.StartDate < i)
where c.StartDate >= firstdate
and c.StartDate <= enddate
select c)

Что-то в этом роде.

1 голос
/ 17 апреля 2010

Я не пробовал это на EF, но на Linq для объектов он работает нормально:

var result = source
  .OrderBy(x => x.start)
  .GroupBy(x => x.start < startDate)
  .SelectMany((x, i) => i == 0 ? new[] {new { value = x.Last().value, start = x.Last().start }} : x.Where(y => y.start < endDate));

Проблема в том, что в C # LINQ отсутствует оператор, который дает вам доступ к предыдущему элементу в последовательности. F #, видимо, может справиться с этим. Обходные пути включали либо GroupBy, либо Aggregate. В этом случае GroupBy может справиться с этим.

Это не красиво, и я бы не рекомендовал использовать его в двухфазном подходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...