Domanda

Ho la seguente query linq2sql, e sto fissando il risultato a un POCO. Una delle mie proprietà POCO è un'enumerazione.

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

Quando eseguo la query, ottengo il seguente errore.

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

hmm. c'è un modo che posso essere abbastanza difficile da rendere il risultato int vengono convertiti al mio enum personalizzato?

È stato utile?

Soluzione

Si può effettivamente utilizzare le enumerazioni direttamente a LINQ to SQL (ma non Entity Framework); basta cambiare il tipo di proprietà (nel dbml / designer) al tipo enum completo, e lo farà il cast per voi. Si potrebbe desiderare di chiamare AchievementType, ovviamente -. E questo assume un (getto) Traduzione dritto

Se questo non va bene per lo scenario, probabilmente dovrete per selezionarla come un intero, e poi fare il cast finale di LINQ to Objects (via AsEnumerable ()). Si potrebbe anche provare un cast dritto (sempre che sia sufficiente) al posto del tuo metodo di estensione generico:

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

Non è che se il tipo Models.Achievement è definito nel dbml, non è possibile creare in questo modo - dovete semplice selezionarlo. Ma se questo non fa parte del modello db, allora è bene. qui 'un esempio per le stringhe relative alla mappatura enumerazioni in LINQ -to-SQL.

Se nessuno di questi abiti, l'altro approccio è quello di dichiarare la proprietà enum come spessore in una classe parziale. Ho dato un esempio di questo qui (per EF, ma funziona lo stesso), ma si noti che se si esegue questa operazione, non è possibile utilizzare la proprietà enum in Where clausole, ecc, in quanto non è mappato nel modello .

Altri suggerimenti

Forse si potrebbe provare qualcosa di simile in te dichiarazione Models.Achievement:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top