动态LINQ比较实体框架中的日期

Cra*_*gly 5 .net linq linq-to-entities entity-framework dynamic-linq

我正在使用动态linq库与实体框架,并希望比较日期.我已成功地扩展基于以下SO文章库这里不过似乎什么我不能做的是使该库比较只是我的实体对象的日期时间属性的日期部分,我会与正常的LINQ表达式做.

我想要做的是让动态linq像这样创建一个lambda:

// Compare just dates
p => p.CreatedDate.Value.Date == '2012/08/01'
Run Code Online (Sandbox Code Playgroud)

而不是:

// Compares date + time
p => p.CreatedDate == '2012/08/01'
Run Code Online (Sandbox Code Playgroud)

对此有任何想法将非常感激.

luk*_*san 4

Dynamic Linq 解析器支持该System.DateTime类型的所有公共成员,包括Date属性。所以你可以做类似的事情

DateTime comparisonDate = new DateTime(2012, 8, 1);
var query = items.Where("CreatedDate.Value.Date == @0", comparisonDate);
Run Code Online (Sandbox Code Playgroud)

更新:如果您使用实体框架,此示例将不起作用,因为它不支持将DateTime.Date属性转换为 SQL。通常,您可以使用该EntityFunctions.TruncateTime()函数来达到相同的效果,但是如果不进行修改,Dynamic Linq 解析器将无法访问该函数。但是,您应该能够执行类似于以下内容的操作(尚未测试):

var query = items.Where("CreatedDate.Value.Year == @0.Year && CreatedDate.Value.Month == @0.Month && CreatedDate.Value.Day== @0.Day", comparisonDate);
Run Code Online (Sandbox Code Playgroud)