2010-07-06 4 views
1

Existe-t-il un moyen d'utiliser un type de données personnalisé dans l'entité renvoyée par Linq to SQL?Utilisation d'un type de données personnalisé dans Linq to SQL

Dire que j'ai un type de données comme ceci:

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

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

    ... 
} 

Il définit également les opérateurs pour == = et ainsi de suite!.

Lorsque j'essaie de remplacer l'une des propriétés dans l'entité renvoyée, j'obtiens une exception Invalid cast from 'System.String' to 'CustomerNumber' même si vous pouvez affecter le CustomerNumber à partir d'une chaîne.

Est-ce que ce n'est pas possible ou est-ce que je fais quelque chose de mal?

Edition - Précision:

Le CustomerNumber est utilisé en tant que type de données sur l'entité qui obtient généré par le LINQ to SQL. L'exception se produit lors d'une tentative d'interrogation de la base de données. Ce n'est pas quelque chose que j'essaie de lancer, c'est quelque part dans la magie de LinqToSQL que les choses tournent mal.

Mon code ressemble à ceci:

var customers = DataContext.Customers; 

Edit:

Il se avère que si votre struct met en œuvre un opérateur explicite cela fonctionne ou plutôt, il travaille avec une struct qui met en œuvre un explicite l'opérateur pour convertir de la chaîne au type mais pas si c'est pour convertir de System.Int32 au type.

Modifier à nouveau: Cela ne fonctionne toujours pas.

+0

Pouvez-vous nous montrer le code où vous créez le CustomerNumber et essayer de changer une propriété? –

+0

Mise à jour ma question avec des clarifications. –

Répondre

1

Je pense que la seule façon de le faire est de l'écrire en tant que propriété dans la classe partielle générée par L2S. Si vous rendez la propriété Column privée, vous pouvez en conserver une chaîne, puis l'utiliser comme magasin de sauvegarde pour votre propriété personnalisée en exposant votre type personnalisé.

+0

J'ai fini par faire de cette façon même si ce n'est pas ce que je voulais faire depuis le début. –

+0

Cette solution ne fonctionne pas avec des requêtes comme 'DataContext.Customers.Where (w => w.CustomProperty == 1);' car elle n'a pas de traduction en SQL. –

+0

Bien sûr, vous ne pouvez pas interroger dessus, bien sûr. L'implémentation de IQueryable par L2S ne sait pas comment le mapper. Je me demande s'il existe un moyen de fournir un AttributeMappingSource personnalisé ou de modifier le MetaModel pour lui indiquer comment mapper le type personnalisé. – codekaizen

0

approche correcte (de MSDN) est:

Si une classe implémente Parse() et ToString(), vous pouvez mapper l'objet à tout type de texte SQL (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXTE , NTEXT, XML). L'objet est stocké dans la base de données en envoyant la valeur renvoyée par ToString() à la colonne de base de données mappée. L'objet est reconstruit en invoquant Parse() sur la chaîne retournée par la base de données.