我有一个IQueryable<Journey>
,我从我的实体模型收集。我想用它来获得一组新的IQueryable<Journey>
,但只能在特定的日期间隔内从我的网页上的2个文本框。
一个Journey
有Journey.DateFrom
和Journey.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格式?
请帮忙:)
我想试试这个:
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?)
哎呀,我错过了公认的答案,但我仍然会留下我的第一个编辑…