Comment cela Linq2Sql peut créer un ENUM dans la clause select?
-
21-08-2019 - |
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é?
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;
}
}