我有一个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>
,但由于数据im比较非常庞大,因此网站崩溃的速度非常慢。
我如何解决这个问题,是将db格式转换为datetime的唯一答案?
请帮助:)
答案 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);