如何在LINQ中比较字符串列(作为DateTime)?

时间:2012-07-02 02:58:26

标签: c# linq

我有一个带有ValidDate字段的数据库 - 它是一个字符串(我们犯了一个错误,它应该是一个日期时间,但我们现在无法修改数据库。)

现在我想将此字段与网站上的参数(validDateStart)进行比较:

priceList = priceList.Where(p => Convert.ToDateTime(p.ValidDate) >= Convert.ToDateTime(validDateStart));
var list = initPriceList.ToList();

但是我收到错误:没有实现ToDateTime方法。

有人可以给我一些帮助吗?谢谢!

2 个答案:

答案 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 SqlLinq 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这样的格式,它可能无效。