2017-02-21 86 views
0

假设我物化数据有一个实体:EF6:使用自定义类型

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

除了作为一个模型对象:

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

其中日期是可以由一个隐式转换的自定义类型日期时间:

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.DateTime的”输入“SMG.Web.Date”。 LINQ to Entities仅支持投射EDM基元或枚举类型。

是的,我知道我可以通过一些临时对象的帮助实现我需要的东西,将DateTime值实现到内存中,然后将其转换为我的自定义类型。但是如果我不想使用这种策略,并且想要一步完成这一操作,该怎么办?

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

+0

在“选择(...)”之前执行'ToList()' – DavidG

+1

您是否真的读过它? – drty

+0

是的,这就是我评论而不是回答的原因。 – DavidG

回答

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。

+0

您是否真的在LINQ-to-Entities查询中尝试了这一点? –

+0

类似的东西。无可否认,我使用LINQPad进行测试,但它使用EF 6.1.3生成了正确的SQL。 –

+0

我会期望EF抛出一个异常,因为它不知道'Date'类型:它不是一个映射类型,它不在它的已知类型映射的集合中。显然,它只是试图将一个DateTime分配给映射到数据库中的DateTime列的任何属性,并且当接受属性成功地“吞食”DateTime值时成功。当然,这不适用于代码优先,因为EF甚至无法从未知类型开始创建数据库列。 –