2017-02-21 84 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甚至無法從未知類型開始創建數據庫列。 –