首页 > 解决方案 > C# LINQ/EF 在具有值转换的属性上抛出无效强制转换

问题描述

在我的数据库中,我有一个表Objects

   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 和双精度类型之间进行比较,但我怀疑 LINQ 不能与 EF 不同的 ValueConversions 工作。有没有办法让它工作,或任何解决方法?

标签: c#asp.netentity-frameworklinq

解决方案


您也许可以使用表达式,如下所示:

public static Expression<Func<Objects, bool>> IsHigherThanDouble(double someDouble)    
{        
   return (objects) => objects.CreationDate.Timestamp < someDouble;
}

然后你可以这样做:

fetch = await Objects.Where(IsHigherThanDouble(someDouble)).ToListAsync();

推荐阅读