EF6:使用自定义类型实现数据

时间:2017-02-21 22:00:46

标签: entity-framework linq

假设我有一个实体:

public class Event
{
    ...
    public DateTime At { get; set; }
}

以及模型对象:

public class Something
{
    ...
    public Date At { get; set; }
}

其中Date是一个自定义类型,可以从DateTime隐式转换:

public struct Date
{
    public Date(DateTime value)
    {
        ...
    }
    ...
    public static implicit operator Date(DateTime value)
    {
        return new Date(value);
    }
}

我尝试做的是将数据从数据库中提取到模型中:

var events = db.Events
    .Select(x => new Something
    {
        ...
        At = x.At,
    })
    .ToList();

当然,这是失败的,但有以下例外:

  

无法转换类型&System;日期时间'输入' SMG.Web.Date'。 LINQ to Entities仅支持转换EDM原语或枚举类型。

是的,我知道我可以借助一些临时对象实现我需要的东西,将DateTime值实现到内存中,然后将其转换为我的自定义类型。但是,如果我不想使用这种策略,并希望一步到位,那该怎么办呢。

问题是:有没有办法教LINQ到实体如何在现实的这一面处理我的自定义日期?

1 个答案:

答案 0 :(得分:1)

你的演员阵容是错误的。将其改写为:

public struct Date
{
    public Date(DateTime value)
    {
        DateTimeValue = value;
    }

    // Or whatever your field or property is called
    public DateTime DateTimeValue { get; }

    public static implicit operator DateTime(Date date)
    {
        return date.DateTimeValue;
    }
}

然后EF应该让你在表达式中使用它。这种方法不适用于代码优先的EF。