Linq to Entities 不支持此功能(据我所知,Linq to SQL 也不支持)。请记住,您的查询是在数据库上执行的——那里根本没有对等的 for Convert.ToDateTime
。
查询中的任何字符串解析实际上只是一种解决方法 - 作为真正的解决方案,使这些列不是字符串而是datetime
在数据库中,并且您首先不会遇到这个问题。
一个 hacky 的解决方法是实现所有行(您可以使用AsEnumerable()
它),然后进行解析 - 虽然这会产生糟糕的性能,但如果行数很少,可能会足够好:
var startDate = DateTime.Parse(validDateStart);
var list = priceList.AsEnumerable()
.Where(p => DateTime.Parse(p.ValidDate) >= startDate);
.ToList();
编辑:
通过您的示例更新,您似乎可以只进行字符串比较来做您想做的事情 - 授予它仍然是一个 hack,但比实现所有行的性能要好得多。这是可能的,因为您的日期格式将最重要的数字放在首位,然后是不太重要的部分 - 它是年份,然后是月份,然后是日期(如果不是这种情况,并且在您的示例中,日期在月份之前,则此解决方案将不起作用)。
假设您的输入字符串validDateStart
也采用相同的格式,您可以这样做:
var list = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) >=0);
.ToList();
在Linq to Sql和Linq to EntitiesString.CompareTo
中似乎都支持字符串比较。