我正在使用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
上执行转换,因此我不确定这是否会导致性能下降。这是好还是有更好的方法吗?
答案 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查询。