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

时间:2011-04-18 08:56:29

标签: c# linq entity-framework iqueryable

我有一个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>,但由于数据im比较非常庞大,因此网站崩溃的速度非常慢。

我如何解决这个问题,是将db格式转换为datetime的唯一答案?

请帮助:)

4 个答案:

答案 0 :(得分:2)

我试试这个:

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 :(得分:1)

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

答案 2 :(得分:0)

由于字符串格式的排序顺序与它们所代表的日期相同,我不明白为什么你必须完全转换它们的数据格式。做(未经测试):

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;

(Detbordevälfungera,Joakim?)

哎呀,我错过了接受的答案,但我仍然会离开我的第一个编辑......

答案 3 :(得分:0)

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