Pergunta

Eu tenho um Linq to Entities consulta como esta:

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == (int)pCategory
              select r;

Normalmente, eu uso o código abaixo para verificar se alguns resultados são retornados:

if (results.Count() > 0)
{
    return new oMachineRevision(results.First().IdMachineRevision);
}

No entanto, estou ficando NotSupportedException na se condição.

A mensagem de erro é: Não é possível criar um valor constante do tipo 'Tipo de Encerramento'. Somente os tipos primitivos ( 'como Int32, String e Guid') são suportados neste contexto.

Note que pCategory é um tipo Enum.

Foi útil?

Solução

Editar : Com base na sua atualização, o erro pode estar relacionado a um enum em sua classe de entidade. Veja este blogue entrada para obter mais informações e um trabalho -por aí. Estou deixando minha resposta original como uma melhoria em sua sintaxe de consulta.

Tente fazer a seleção da primeira entidade na consulta em si usando FirstOrDefault e, em seguida, verificar se o resultado é nulo.

int compareCategory = (int)pCategory; // just a guess
var result = (from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == compareCategory
              select r).FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

Outras dicas

Por que não usar FirstOrDefault () em vez disso, e verificar se há nulo? Eu não posso ver o benefício em consulta para a contagem e, em seguida, tomar o primeiro elemento.

Na implementação padrão de linq, os operadores "select" e "onde" mapeiam para métodos que retornam um IEnumerable ou IQueryable. métodos LINQ Então padrão quando usado deve sempre retornar um IEnumerable de sua consulta não um único objeto.

métodos

Mas LINQ que são candidatos para os operadores LINQ não se restringem a métodos que retornam IEnumerables, qualquer método retornando nada pode ser escolhido.

No caso de ter métodos de instância chamada "Select" e "Onde" que retornar um único objeto ou extensões de métodos que são específicos para sua classe e retornar um único objeto aqueles serão utilizados em vez dos LINQ padrão.

Meu palpite é que seja um "Select" ou "Onde" método definido na sua classe está fazendo linq retornar um valor único em vez de um IEnumerable<T>.

Eu não sabia diferentes objetos anônimos seria criado, dependendo do resultado da consulta. Eu acho que eles resultados só queria ser do tipo IEnumerable

Que tal usar um foreach?

var results = from r in entities.MachineRevision
              where r.Machine.IdMachine == pIdMachine
                 && r.Category == pCategory
              select r;

foreach( var r in results )
{
    yield return new oMachineRevision( r.IdMachineRevision );
}

Isso vale para todos os tipos implícitos também. Devo admitir que eu sempre esqueço isso e é assim que me deparei com este post.

Se você tiver

class ClassA {
               ...

               private string value;

               ...

               public static implicit operator string(ClassA value)
               {
                    return value.ToString();
               } 

              ...
}

que você precisa para lançar explicitamente a classe para aString para comparação.

então eu costumo fazer isso

    var myClassAStr = myClassA.ToString();

    var x = (from a in entites where a.ValToCompare == myClassAStr select a).first();

// do stuff with x
    ...

tente usar

IENumerable<MachineRevision> results = from r in entities.MachineRevision
...

em seu lugar.

Eu acho que é o var que está causando o problema.

Editar:

Leia a mensagem de erro. "Não é possível criar um valor constante do tipo 'Tipo de Encerramento'. Somente os tipos primitivos ( 'como Int32, String e Guid') são suportados neste contexto."

Uma dessas comparações é com um tipo que não é int, string ou guid. Eu estou supondo que a categoria.

r.Machine.IdMachine == pIdMachine && r.Category == pCategory

Curiosamente, LinqToSql permitirá esta construção. Não sei porque LinqToEntities não suporta isso.

Eu acho que você também pode selecionar o item que deseja outra, maneira mais simples usando expressões lambda.

var result = entities.MachineRevision
                 .Where(x => x.Machine.IdMachine == pIdMachine)
                 .Where(y => y.Category == (int)pCategory)
                 .FirstOrDefault();

if (result != null)
{
     return new oMachineRevision(result.IdMachineRevision);
}

e em seguida, proceder como faria normalmente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top