2010-07-06 61 views
1

有沒有在Linq to SQL返回的實體中使用自定義數據類型的方法?在Linq to SQL中使用自定義數據類型

說我有這樣的數據類型:

public struct CustomerNumber : IEquatable<string> 
{ 
    private string _value; 

    public static implicit operator CustomerNumber(string value) 
    { 
     return new CustomerNumber { _value = value }; 
    } 

    ... 
} 

它還定義了運營商== =等等!

當我嘗試替換返回實體中的某個屬性時,即使您可以從字符串中指定CustomerNumber,也會收到異常Invalid cast from 'System.String' to 'CustomerNumber'

這不可能或者我做錯了什麼?

編輯 - 澄清:

CustomerNumber用作上得到由LINQ到SQL生成的實體的數據類型。嘗試查詢數據庫時發生異常。這不是我想要投射的東西,它在LinqToSQL魔術裏的某個地方出現了問題。

我的代碼看起來是這樣的:

var customers = DataContext.Customers; 

編輯:

事實證明,如果你的結構實現它的工作原理或者說一個明確的運營商,它的工作與實現一個明確的一個結構運算符將字符串轉換爲類型,但不是從System.Int32轉換爲類型。

再次編輯:它仍然不起作用。

+0

您能向我們展示創建CustomerNumber的代碼並嘗試更改屬性嗎? – 2010-07-06 11:25:11

+0

通過澄清更新了我的問題。 – 2010-07-06 11:45:40

回答

1

我認爲你能做到這一點的唯一方法就是把它寫成L2S生成的部分類的一個屬性。如果您將Column屬性設爲私有,則可以將其保留爲一個字符串,然後將其用作暴露自定義類型的定製屬性的後備存儲。

+0

即使不是我想從一開始就想做的方式,我最終也是這樣做了。 – 2010-07-06 13:53:20

+0

此解決方案不適用於諸如'DataContext.Customers.Where(w => w.CustomProperty == 1)之類的查詢;'因爲它沒有對SQL的轉換。 – 2010-07-08 09:05:40

+0

對,當然你不能查詢它。 L2S的IQueryable實現不知道如何映射它。我想知道是否有辦法提供自定義的AttributeMappingSource或更改MetaModel來告訴它如何映射自定義類型。 – codekaizen 2010-07-08 09:12:43

0

正確的做法(從MSDN)是:

如果一個類實現解析()和toString(),您可以映射對象的任何SQL文本類型(CHAR,NCHAR,VARCHAR,NVARCHAR,TEXT ,NTEXT,XML)。該對象通過將ToString()返回的值發送到映射數據庫列來存儲在數據庫中。該對象通過調用Parse()對數據庫返回的字符串進行重構。