2017-06-21 62 views
0

我试图使用Dynamic Linq Query创建一个函数来比较两个日期之间的字段。 功能如下:日期间的动态Linq查询

public static IQueryable<T> BetweenDates<T>(this IQueryable<T> models, DateTime startDate, DateTime endDate, string propertyName) 
{ 
    var start = new DateTime(startDate.Year, startDate.Month, startDate.Day, 0, 0, 1); // Set to 1 second past midnight 
    var end = new DateTime(endDate.Year, endDate.Month, endDate.Day, 0, 0, 0); // Set to midnight 

    return models.Where($"{ propertyName } => { start } && { propertyName } <= { end }"); 
} 

如果我跑,我得到一个错误:

Expression expected

,但我无法弄清楚什么是错的。 有没有人做过这个?

+0

我不知道这是否会解决您的问题,但你有你的“大比“语法错误,它应该是'{propertyName}> = {开始} ...' – stuartd

回答

2

我不记得在动态LINQ字符串表达式DateTime文本格式(显然只是包括他们的字符串表示在尝试是不够的),但你可以通过附加params object[] values参数传递参数,并指他们内部字符串由位置@0@1@2等:

return models.Where($"{propertyName} >= @0 && {propertyName} <= @1", start, end); 

这将在生成的查询结合startend为恒定值。

如果你想让他们变得参数,然后用类似这样的匿名类型(显式关闭):

return models.Where($"{propertyName} >= @0.start && {propertyName} <= @0.end", new { start, end }); 
+0

虽然这似乎是更好的(我没有得到一个错误)它确实似乎格式化不正确,因此返回没有结果。它得到了转换为:convert(datetime2,'2017-06-21 00:00:00.0000000',121)'这不是我想要的(我猜) – r3plica

+0

嗯,这是完全相同的,如果你绑定常量您的查询。你在寻找参数化查询吗? –

+0

我认为它有效,我会做一些更多的测试,在发现可能未连接的客户端之前发生了一些奇怪的事情 – r3plica