动态LINQ日期查询性能

时间:2018-02-19 08:23:32

标签: c# entity-framework linq entity-framework-core

我正在使用System.Linq.Dynamic.Core库在我的项目中生成查询。我收到一个日期字符串,我想做动态等效的这个:

db.EntityName
    .Where(x => x.StartDate > DateTime.ParseExact("02/19/2018", "MM/dd/yyyy", CultureInfo.InvariantCulture))

我发现以下查询有效:

db.EntityName
    .Where($"x => x.StartDate.ToFileTime() > { DateTime.ParseExact("02/19/2018", "MM/dd/yyyy", CultureInfo.InvariantCulture).ToFileTime() }")

这是正确的做法吗?它在StartDate上执行转换,因此我不确定这是否会导致性能下降。这是好还是有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

这不是一个好主意。 EF不知道如何将ToFileTime()转换为SQL查询,因此它只会查询整个表并在客户端的内存中执行Where。正确的方法是使用参数:

db.EntityName
    .Where($"x => x.StartDate > @0", DateTime.ParseExact("02/19/2018", "MM/dd/yyyy", CultureInfo.InvariantCulture));

@0表示列表中的第一个参数,我们为其传递已解析的DateTime对象。

如果您不确定性能是否有问题 - 启用EF日志记录并查看生成的SQL查询。