Pergunta

Eu tenho a seguinte consulta linq2sql, e eu estou definindo o resultado para um POCO. Uma das minhas propriedades POCO é uma enumeração.

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 eu executar a consulta, eu recebo o seguinte erro.

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

hmm. há uma maneira que eu posso ser bastante complicado para fazer o resultado INT são convertidos para o meu enum personalizado?

Foi útil?

Solução

Você pode realmente usar enums diretamente no LINQ to SQL (mas não Entity Framework); basta alterar o tipo da propriedade (no dbml / designer) com o tipo enum totalmente qualificado, e ele vai fazer o elenco para você. Você pode querer chamá-lo AchievementType, é claro -. E isso pressupõe uma tradução em linha reta (elenco)

Se isto não se encaixam no seu cenário, você provavelmente vai ter que selecioná-lo como um número inteiro, e depois fazer o elenco final em LINQ-to-Objects (via AsEnumerable ()). Você também pode tentar um elenco reta (assumindo que este é suficiente) em vez de seu método de extensão genérica:

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

Não que se o tipo Models.Achievement é definido no dbml, você não pode criar-lo desta maneira - você tem que simples selecioná-lo. Mas se isso não faz parte do db-modelo então é bom. Aqui 'sa exemplo relacionado para cadeias de mapeamento para enums em LINQ -a-SQL.

Se nenhum desses fatos, a outra abordagem é declarar a propriedade enum como um calço em uma classe parcial. Eu dei um exemplo dessa aqui (para EF, mas funciona da mesma), mas nota que se você fizer isso, você não pode usar a propriedade enum em Where cláusulas etc, uma vez que não está mapeada no modelo.

Outras dicas

Talvez você poderia tentar algo como isto em você declaração Models.Achievement:

  AchievementType achievementType{
    get
      {
         return this.AchievementTypeId.ToEnum<Models.AchievementType>();
      }
      set
      {
        this.AchievementTypeId = (int)value;
      }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top