如何在IQueryable<>中选择日期间隔

本文关键字:选择 日期 IQueryable | 更新日期: 2023-09-27 17:50:31

我有一个IQueryable<Journey>,我从我的实体模型收集。我想用它来获得一组新的IQueryable<Journey>,但只能在特定的日期间隔内从我的网页上的2个文本框。

一个JourneyJourney.DateFromJourney.DateTo,它们是字符串("YYYYMMDD")。

我想我会这样做:

(行程是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格式?

请帮忙:)

如何在IQueryable<>中选择日期间隔

我想试试这个:

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

为什么不将文本框值转换为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);
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);

作为字符串格式,您按照与它们表示的日期相同的顺序进行排序,我不明白为什么您必须转换它们的数据格式。只需执行(未经测试):

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

更新,在Joakim的评论之后,仍然只是使用字符串的排序顺序:

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

(Det border väl fungera, Joakim?)

哎呀,我错过了公认的答案,但我仍然会留下我的第一个编辑…