Question

J'ai la requête linq2sql suivante, et je suis le résultat à la mise a Poco. L'une de mes propriétés POCO est une énumération.

public IQueryable<Models.Achievement> GetAchievements()
{
    return from a in _sqlDatabase.Achievements
        select new Models.Achievement
            {
                // Note: ToEnum is an extension method that converts an int -> the enum.
                AchievementType = a.AchievementTypeId.ToEnum<Models.AchievementType>(),
                DateTimeCreated = a.DateTimeCreated,
                UserId = a.UserId
            };
}

Quand je lance la requête, je reçois l'erreur suivante.

System.NotSupportedException: Method 'Models.AchievementType 
    ToEnum[AchievementType](int)' has no supported translation to SQL.

hmm. est-il un moyen que je peux être assez difficile à rendre le résultat int se converti à mon ENUM personnalisé?

Était-ce utile?

La solution

Vous pouvez réellement utiliser énumérations directement dans LINQ to SQL (mais pas Entity Framework); il suffit de changer le type de la propriété (dans le dbml / designer) au type ENUM complet, et il fera le casting pour vous. Vous pouvez l'appeler AchievementType, bien sûr -. Et cela suppose une traduction directe (cast)

Si cela ne correspond pas à votre scénario, vous devrez probablement le sélectionner comme un entier, puis faire le casting final LINQ-to-objets (via AsEnumerable ()). Vous pouvez également essayer un casting droit (en supposant que cela suffit) à la place de votre méthode d'extension générique:

select new {..., AchievementType = (AchievementType) foo.Bar, ...}

Non pas que si le type de est défini dans Models.Achievement le dbml, vous ne pouvez pas créer de cette façon - vous devez simplement sélectionner. Mais si cela ne fait pas partie du modèle db-il est très bien. 'exemple Sá lié pour les chaînes de cartographie à énumérations dans LINQ -À-SQL.

Si aucune de ces combinaisons, l'autre approche est de déclarer la propriété ENUM comme une cale dans une classe partielle. J'ai donné un exemple de ce

Autres conseils

Peut-être que vous pourriez essayer quelque chose comme ça en vous déclaration Models.Achievement:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
scroll top