2010-05-03 6 views
4

peut-être quelqu'un peut vous aider.Problème avec Mapping/Casting Linq-to-Sql sur différents types

Je souhaite disposer d'un type de données Linq-Class différent.

Cela fonctionne:

private System.Nullable<short> _deleted = 1; 

[Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)] 
    public System.Nullable<short> deleted 
    { 
     get 
     { 
      return this._deleted; 
     } 
     set 
     { 
      this._deleted = value; 
     } 
    } 

Bien sûr. Mais pas quand je veux mettre une certaine logique pour booléenne, comme ceci:

private System.Nullable<short> _deleted = 1; 

[Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)] 
    public bool deleted 
    { 
     get 
     { 
      if (this._deleted == 1) 
      { 
       return true; 
      } 
      return false; 
     } 
     set 
     { 
    if(value == true) 

    { 
       this._deleted = (short)1; 
    }else 
    { 
       this._deleted = (short)0; 
    } 
     } 
    } 

Je reçois toujours erreur d'exécution:

[TypeLoadException: GenericArguments[2], "System.Nullable`1[System.Int16]", on 'System.Data.Linq.Mapping.PropertyAccessor+Accessor`3[T,V,V2]' violates the constraint of type parameter 'V2'.] 

Je ne peux pas changer la base de données peu .. je dois avoir lancer dans la classe de cartographie.

** Mise à jour

Selon mmcteam, coulée dans la méthode unmapped le tour est joué. Vous ne savez pas si vous utilisez le mappage OR de cette façon, mais cela fonctionne.

private System.Nullable<short> _deleted = 1; 

    public bool deleted 
    { 
     get 
     { 
      if (this._deleted == 0) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 
     set 
     { 
      if (value) 
      { 
       this._deleted = 1; 
      } 
      else 
      { 
       this._deleted = 0; 
      } 
     } 
    } 


    [Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)] 
    private short? deleted_smallint 
    { 
     get 
     { 
      return this._deleted; 
     } 
     set 
     { 
      this._deleted = value; 
     } 
    } 

** AVIS/PROBLÈME

Vous ne pouvez pas utiliser les méthodes ne sont pas mappés sur les requêtes LINQ!

    var result = from p in dc.Products 
           where p.enabled && !p.deleted 
       select p; 

provoque une exception SQL non prise en charge. Sans la condition where, les données sortent avec des valeurs correctes.

Répondre

0

Ne vous voulez ceci:

[Column(Storage = "_deleted", Name = "deleted", DbType = "Bit", CanBeNull = false)] 
public bool deleted ... 

Au lieu de cela:

[Column(Storage = "_deleted", Name = "deleted", DbType = "SmallInt", CanBeNull = true)] 
public bool deleted ... 

?

+0

Non, car cela ne fonctionne pas aussi. dbtype n'est pas Boleanen, est SmallInt immuable! Cela provoque juste une autre erreur d'exécution de type de données incorrect Boolean. – csharpnoob

4

Ou ajoutez simplement une propriété de plus à votre classe de lignes et lancez la précédente à bool.

+0

votre droit! c'est ce qu'il a fait. – csharpnoob

+0

ok, nous venons d'atteindre le prochain problème. les méthodes qui ne sont pas mappées ne peuvent pas être utilisées dans la requête linq. voir la mise à jour en question. – csharpnoob

+0

Il est une mauvaise idée d'utiliser des propriétés personnalisées dans votre requête linq, imaginez que vous voulez grouper ou commander par cette nouvelle propriété. Linq ne peut pas générer cette requête pour vous. Mais selon la situation, vous pouvez écrire tout ce dont vous avez besoin sur linq, puis exécuter la requête (par exemple en appelant ToList()) puis en utilisant des objets en mémoire, vous pouvez utiliser n'importe quelle méthode cutom dans votre requête linqToObjects –

Questions connexes