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

时间:2012-08-28 20:58:08

标签: .net linq entity-framework linq-to-entities dynamic-linq

我正在使用带有实体框架的动态linq库,并希望比较日期。我已经根据以下SO文章here成功地扩展了库。但是,我似乎无法做到的是让库只比较我的实体对象的DateTime属性的日期部分,就像我做的那样正常的linq表达。

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

// Compare just dates
p => p.CreatedDate.Value.Date == '2012/08/01'

而不是:

// Compares date + time
p => p.CreatedDate == '2012/08/01'

对此的任何想法都将非常感激。

1 个答案:

答案 0 :(得分:4)

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

的事情
DateTime comparisonDate = new DateTime(2012, 8, 1);
var query = items.Where("CreatedDate.Value.Date == @0", comparisonDate);

更新:如果您使用的是Entity Framework,则此示例将不起作用,因为它不支持将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);