在我的数据库中,我有一个表对象:
public class Objects {
[Key]
public int ID { get; set; }
blah blah blah
public JCal CreationDate { get; set; }
}
属性CreationDate有一个值转换器,如下所示:
var stdJCalConversion = new ValueConverter<JCal, double>(
v => v.Timestamp,
v => new JCal(v));
modelBuilder
.Entity<Objects>()
.Property(e => e.CreationDate )
.HasConversion(stdJCalConversion );
但是,当我尝试运行一个简单的where子句时,如以下所示:
fetch = await Objects.Where(c => c.CreationDate > someDouble).ToListAsync();
我得到以下异常:InvalidCastException:从"System.Double"到"x.Types.JCal"的无效强制转换。
定义JCal的结构具有运算符重载,用于在JCal和double类型之间进行比较,但我怀疑LINQ不能像EF那样处理ValueConversions。有没有办法让它发挥作用,或者有什么变通办法?
您可以使用一个表达式,比如:
public static Expression<Func<Objects, bool>> IsHigherThanDouble(double someDouble)
{
return (objects) => objects.CreationDate.Timestamp < someDouble;
}
然后你可以做:
fetch = await Objects.Where(IsHigherThanDouble(someDouble)).ToListAsync();