Pregunta

Tengo el siguiente consulta linq2sql, y estoy estableciendo el resultado a un Poco. Una de mis propiedades POCO es una enumeración.

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

Cuando corro la consulta, me sale el siguiente error.

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

hmm. ¿hay una manera que puede ser bastante difícil de hacer que el int resultado se convierten a mi enumeración personalizada?

¿Fue útil?

Solución

En realidad se puede utilizar directamente en las enumeraciones de LINQ to SQL (pero no de Entity Framework); acaba de cambiar el tipo de la propiedad (en el dbml / diseñador) para el tipo de enumeración completo, y lo hará el reparto para usted. Es posible que desee llamar AchievementType, por supuesto -. Y esto supone una traducción recta (molde)

Si esto no encaja en el escenario, es probable que tenga para seleccionarlo como un entero, y luego hacer el reparto final en LINQ a Objetos (a través de AsEnumerable ()). También puede probar con un elenco recta (suponiendo que esto es suficiente) en lugar de su método de extensión genérica:

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

No es que si el tipo de Models.Achievement se define en el dbml, no se puede crear de esta manera - que tiene que seleccionarlo sencilla. Pero si esto no es parte de la db-modelo, entonces está bien. aquí 'Sa ejemplo relacionado para cuerdas de mapeo para enumeraciones en LINQ -to-SQL.

Si ninguno de estos trajes, el otro enfoque es declarar la propiedad de enumeración como una cuña en una clase parcial. I dio un ejemplo de este aquí (para EF, pero funciona de la misma), pero tenga en cuenta que si usted hace esto, no se puede utilizar la propiedad de enumeración en Where cláusulas etc, ya que no se asigna en el modelo .

Otros consejos

Tal vez usted podría intentar algo como esto en la declaración que Models.Achievement:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top