Как выбрать интервал дат в IQueryable <>? - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть IQueryable<Journey>, который я собираю из своей модели сущности. Я хочу использовать это, чтобы получить новый набор IQueryable<Journey>, но только в течение определенного интервала дат из 2 текстовых полей на моей веб-странице.

A Journey имеет Journey.DateFrom и Journey.DateTo, которые являются строками («ГГГГММДД»).

Я думал, что сделаю что-то вроде этого:

(путешествия IQueryable<Journey>)

if (tb_DateFrom.Text != ""){
    journeys = from j in journeys
               where Convert.ToInt32(j.DateTo) >= Convert.ToInt32(tb_DateFrom.Text)
               select j;
}
if (tb_DateTo.Text != ""){
        journeys = from j in journeys
                   where Convert.ToInt32(j.DateFrom) <= Convert.ToInt32(tb_DateTo.Text)
                   select j;
    }

Но я получаю сообщение о том, что linq не знает, как это сделать Convert.ToInt32, равно как и int.parse или datetime.parse. Что работает, так это использование IEnumerable<Journey> вместо IQueryable<Journey>, но это настолько медленно, что происходит сбой веб-сайта, поскольку сравниваемые данные довольно велики.

Как я могу решить это, единственный ответ, чтобы получить формат в db для datetime?

Пожалуйста, помогите:)

Ответы [ 4 ]

2 голосов
/ 18 апреля 2011

Я бы попробовал это:

if (tb_DateFrom.Text != "") {
    journeys = from j in journeys
               where j.DateTo.CompareTo(tb_DateFrom.Text) >= 0
               select j;
}

if (tb_DateTo.Text != "") {
    journeys = from j in journeys
               where j.DateFrom.CompareTo(tb_DateTo.Text) <= 0
               select j;
}
1 голос
/ 18 апреля 2011

Почему бы вам не преобразовать значения текстового поля в datetime, а затем сравнить даты в предложении where вместо преобразования в int

 DateTime? dateFrom = null, dateTo = null;

 if(!String.IsNullOrWhiteSpace(tb_DateFrom.Text))
    dateFrom = DateTime.ParseExact(tb_DateFrom.Text, "yyyyMMdd", null);

 if (!String.IsNullOrWhiteSpace(tb_DateTo.Text))
    dateTo = DateTime.ParseExact(tb_DateTo.Text, "yyyyMMdd", null);

 if (dateFrom.HasValue)
    journeys = journeys.Where(j => j.DateFrom >= dateFrom.Value);

 if (dateTo.HasValue)
    journeys = journeys.Where(j => j.DateTo <= dateTo.Value);
0 голосов
/ 18 апреля 2011
private DateTime getDate(string yyyyMmDd, DateTime defaultValue)
{
  DateTime ret  = DateTime.MinValue;
  if (!DateTime.TryParse(yyyyMmDd, out ret)) 
     return defaultValue;

  return ret;
}

var to = DateTime.Parse(tb_DateTo.Text);
var from  = DateTime.Parse(tb_DateFrom.Text);
journeys.Where(j=> getDate(j.DateFrom, DateTime.MaxValue) <= from && getDate(j.DateTo, DateTime.MinValue) >= to);
0 голосов
/ 18 апреля 2011

Поскольку формат строки у вас отсортирован в том же порядке, что и даты, которые они представляют, я не понимаю, зачем вам вообще конвертировать их формат данных.Просто сделайте (не проверено):

journeys = from j in journeys
               where j.DateTo >= tb_DateFrom.Text && j.DateFrom >= tb_DateTo.Text
               select j;

Обновите, после комментария Йоаким, все еще просто используя порядок сортировки строк:

journeys = from j in journeys
           where j.DateTo.CompareTo(tb_DateFrom.Text) >= 0 && 
                 j.DateFrom.CompareTo(tb_DateTo.Text) <= 0
           select j;

(Det borde väl fungera, Joakim?)

Упс, я пропустил принятый ответ, но все равно оставлю свое первое редактирование ...

...