我有一个带有ValidDate字段的数据库 - 它是一个字符串(我们犯了一个错误,它应该是一个日期时间,但我们现在无法修改数据库。)
现在我想将此字段与网站上的参数(validDateStart)进行比较:
priceList = priceList.Where(p => Convert.ToDateTime(p.ValidDate) >= Convert.ToDateTime(validDateStart));
var list = initPriceList.ToList();
但是我收到错误:没有实现ToDateTime方法。
有人可以给我一些帮助吗?谢谢!
答案 0 :(得分:3)
Linq to Entities不支持这一点(据我所知,Linq to SQL也不支持)。请记住,您的查询是在数据库上执行 - 其中没有Convert.ToDateTime
的等效项。
查询中的任何字符串解析实际上只是一种解决方法 - 作为一个真正的解决方案,这些列不是字符串而是数据库中的datetime
,并且您不会首先遇到此问题。
一个hacky解决方法是实现所有行(你可以使用AsEnumerable()
),然后进行解析 - 这会有不好的性能但是如果行数很少就可以运行得好:
var startDate = DateTime.Parse(validDateStart);
var list = priceList.AsEnumerable()
.Where(p => DateTime.Parse(p.ValidDate) >= startDate);
.ToList();
修改强>
使用您的示例更新,您似乎可以执行字符串比较来执行您想要的操作 - 授予它仍然是一个黑客但会比实现所有行更好。这是可能的,因为您的日期格式首先放置最重要的数字,然后放置不太重要的部分 - 它是年份,然后是月份,然后是日期(如果不是这种情况,那么在您的示例中月份到来之前这个解决方案将不起作用)。
假设您的输入字符串validDateStart
的格式相同,您可以这样做:
var list = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) >=0);
.ToList();
与String.CompareTo
的字符串比较似乎同时支持Linq to Sql和Linq to Entities。
答案 1 :(得分:0)
如果数据库中的所有记录始终以年,月和日开头(例如:日期格式为yyyy-MM-dd HH:mm:ss或yyyy / MM / dd或yyyyMMdd),无论它是否有分隔符与否。问题是值应该具有以年,月和日开始的格式。
您可以执行以下操作:
1:将过滤器值(网站)转换为与数据库中相同的格式:
// DateTime format in database: yyyy-MM-dd HH:mm:ss:ffffff
var from = filtro.CreationDateFrom?.ToString("yyyy-MM-dd");
var to = filtro.CreationDateTo?.AddDays(1).ToString("yyyy-MM-dd");
2:然后像这样编写你的查询(使用CompareTo方法):
var query = (from x in ctx.TskTaskQueues
where x.CreationDatetime.CompareTo(from) >= 0
&& x.CreationDatetime.CompareTo(to) <= 0
select x);
它对我有用! 我没有使用LinqToEntities,但我使用的LinqConnect(适用于Oracle)与LinqEntities类似。
如果您使用像dd-MM-yyyy这样的格式,它可能无效。