DynamicLinq+entityframework:Dynamicallyselecteddatetimemodification我正在使用System.Linq.Dynamic(在此处管理https://github.com/kahanu/System.Linq.Dynamic)。它非常适合在编译时无需获取所需字段的情况下进行动态选择。在我们的例子中,我们将所有日期时间存储在UTC中。在这种动态选择中,可能需要按小时、年、月等进行分组。在这种情况下,我们必须将数据移至本地时间以防止混淆。示例:varselect=queryable.Select(string.Format("new({0},{1})",datetimeColumn,someOtherColumn));通常在我们的tsql甚至在使用lambda表达式的实体框架中,你可以添加想要的偏移量。但是在动态linq选项中,您似乎无法像使用Linq2Sql那样执行任何日期操作,例如DateTime.AddHours(x)或DateTime.Subtract(x)。entityframework6希望您使用DbFunctions.AddHours(x)等。但是动态linq代码不会在没有修改的情况下无错误地接受DbFunction。示例:varselect=queryable.Select(string.Format("new(System.Data.Entity.DbFunctions.AddHours({0},7)as{0},{1})",datetimeColumn,someOtherColumn));返回错误:类型XXX上不存在属性或字段“系统”(删除命名空间无济于事)。使用所需的代码:varselect=queryable.Select(string.Format("new({0}.AddHours(7),{1})",datetimeColumn,someOtherColumn));结果报错:LINQtoEntitiesnotrecognizedMethod'System.DateTimeAddHours(Double)'method,andthismethodcannotbeconvertedtoastoreexpression.我希望SQL在groupby之前进行日期时间数学运算。一旦发生groupby,就不再有UTC的概念,因为用户将看到本地化的结果集。我担心我会用一些扩展来更新我的github分支以支持传递实体框架扩展,但在我这样做之前,想看看是否有其他人有解决方案或想法。注意:由于可能更改SQL数据存储技术,我没有使用DateTimeOffset。您可以使用自定义ExpressionVisitor对查询表达式进行后处理,并将不受支持的方法替换为其DbFunctions等效方法。这是一个起点,只是为了得到这个想法:if(expression==source.Expression)返回源;返回source.Provider.CreateQuery(expression);}classDbFunctionsBinder:ExpressionVisitor{protectedoverrideExpressionVisitMethodCall(MethodCallExpressionnode){if(node.Object!=null&&node.Object.Type==typeof(DateTime)){if(node.Method.Name=="AddHours"){vartimeValue=Visit(node.Object);varaddValue=Visit(node.Arguments.Single());如果(timeValue.Type!=typeof(DateTime?))timeValue=Expression.Convert(timeValue,typeof(DateTime?));如果(addValue.Type!=typeof(int?))addValue=Expression.Convert(addValue,typeof(int?));varmethodCall=Expression.Call(typeof(DbFunctions),"AddHours",Type.EmptyTypes,timeValue,addValue);返回Expression.Convert(methodCall,typeof(DateTime));}}返回base.VisitMethodCall(node);}}}及示例用法:以上是C#学习教程:动态Linq+实体框架:动态选择日期时间修改所有分享的内容,如果对大家有用还有我需要了解更多C#学习教程,希望大家多多关注——varselect=queryable.Select(string.Format("new({0}.AddHours(7),{1})",datetimeColumn,someOtherColumn))。BindDbFunctions();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
