【发布时间】:2018-07-24 15:59:42
【问题描述】:
我需要编写一个动态构建 LINQ 查询表达式的函数。我无法构建将DateTimeOffset 与DateTimeOffset? 进行比较的Equals 表达式(Expression.Equal 抱怨无法比较类型),我也无法将DateTimeOffset 转换为@987654326 @ 使Expression.Equal 工作,因为无论我使用什么转换策略,DateTimeOffset 都无法转换为DateTimeOffset?。
MyEntity.cs:
public class MyEntity {
public DateTimeOffset? DeliverOn;
}
Main.cs:
public void Test {
IQueryable<MyEntity> MyEntityList = Enumerable.Empty<MyEntity>().AsQueryable();
DateTimeOffset? dt1 = new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);
var expr = WhereEquals(MyEntityList, t => t.DeliverOn, dt1);
}
ExpressionBuilder.cs:
public static IQueryable<TSource> WhereEquals<TSource, TValue>(IQueryable<TSource> source, Expression<Func<TSource, TValue>> selector, TValue value) {
return source.Where(Expression.Lambda<Func<TSource, bool>>(Expression.Equal(selector.Body, Expression.Constant(value)), selector.Parameters));
}
抛出:System.InvalidOperationException: 'The binary operator Equal is not defined for the types 'System.Nullable``1[System.DateTimeOffset]' and 'System.DateTimeOffset'.'
尽管 dt1 在编译时是 DateTimeOffset?,但在运行时,C# 认为 dt1 是 DateTimeOffset。我可以解决这个问题吗?
我试过了:
DateTimeOffset? dt1 = (DateTimeOffset?)new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);DateTimeOffset? dt1 = (DateTimeOffset?)(object)new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero);DateTimeOffset? dt1 = (DateTimeOffset?)Convert.ChangeType(new DateTimeOffset(2018, 01, 01, 00, 00, 00, TimeSpan.Zero), typeof());
但是 dt1 仍然是 DateTimeOffset。
【问题讨论】: