1

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

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

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

但我得到一个错误:方法 ToDateTime 没有实现。

任何人都可以给我一些帮助吗?谢谢!

4

2 回答 2

3

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 SqlLinq to EntitiesString.CompareTo中似乎都支持字符串比较。

于 2012-07-02T03:11:05.537 回答
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,但我使用的是类似于 LinqEntities 的 LinqConnect(用于 Oracle)。

如果您使用这种 dd-MM-yyyy 这样的格式,它可能无法正常工作。

于 2017-07-21T23:16:18.923 回答