Frage

Ich habe die folgende linq2sql Abfrage bekommt, und ich bin das Ergebnis in einem POCO Einstellung. Einer meiner POCO Eigenschaften ist eine Aufzählung.

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
            };
}

Wenn ich die Abfrage ausführen, bekomme ich folgende Fehler.

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

hmm. gibt es eine Weise, die ich genug schwierig sein kann, das Ergebnis int zu machen, um meine benutzerdefinierten Enum bekommen umgewandelt?

War es hilfreich?

Lösung

Sie können tatsächlich Aufzählungen direkt in LINQ-to-SQL (aber nicht Entity Framework) verwenden; ändern, nur die Art der Immobilie (im dbml / Designer) auf den vollständig qualifizierten Enum-Typ, und es wird für Sie die Besetzung tun. Vielleicht haben Sie es nennen wollen AchievementType, natürlich -. Und dies nimmt eine gerade (cast) Übersetzung

Wenn dies nicht Ihr Szenario paßt, werden Sie wahrscheinlich es als eine ganze Zahl zu wählen, und dann in LINQ-to-Objects die endgültige Besetzung tun (via AsEnumerable ()). Sie könnten auch ein gerade gegossenen versuchen (vorausgesetzt, dies ausreichend ist) anstelle der generischen Erweiterungsmethode:

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

Nicht, dass, wenn der Models.Achievement Typ im dbml definiert ist, können Sie es auf diese Weise nicht erstellen - Sie müssen einfach auswählen. Aber wenn dies nicht Teil des db-Modells ist, dann ist es in Ordnung. Hier 'sa verwandtes Beispiel für die Zuordnung von Zeichenkette zu Aufzählungen in LINQ -zu-SQL.

Wenn keine dieser Klagen, der andere Ansatz ist, die Enum-Eigenschaft als Shim in einer Teilklasse zu erklären. Ich habe ein Beispiel für diese

Andere Tipps

Vielleicht könnte man so etwas in Ihnen Models.Achievement Erklärung versuchen:

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