Estou recebendo o seguinte erro ao tentar fazer uma consulta linq:
LINQ to Entities não reconhece o método 'Boolean IsCharityMatching (System.String, System.String)' e esse método não pode ser convertido em uma expressão de armazenamento.
Eu li muitas perguntas anteriores em que as pessoas obtêm o mesmo erro e, se entendi corretamente, é porque o LINQ to Entities requer que toda a expressão de consulta do linq seja traduzida para uma consulta de servidor e, portanto, você não pode chamar um método externo iniciar. Ainda não consegui converter meu cenário em algo que funcione, e meu cérebro está começando a derreter, então esperava que alguém pudesse me apontar a direção certa. Estamos usando o Entity Framework e o padrão de especificação (e sou novo em ambos).
Este é o código que usa a especificação:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Aqui está a expressão linq:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Este é o método IsCharityMatching:
public bool IsCharityMatching(string name, string referenceNumber)
{
bool exists = true;
if (!String.IsNullOrEmpty(name))
{
if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
!this.alias.ToLower().Contains(name.ToLower()) &&
!this.charityId.ToLower().Contains(name.ToLower()))
{
exists = false;
}
}
if (!String.IsNullOrEmpty(referenceNumber))
{
if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
{
exists = false;
}
}
return exists;
}
Deixe-me saber se você precisar de mais informações.
Muito Obrigado,
Annelie
Find()
quando usaIsSatisfied()
dentro dele.Respostas:
Como você descobriu, o Entity Framework não pode realmente executar seu código C # como parte de sua consulta. Ele deve ser capaz de converter a consulta em uma instrução SQL real. Para que isso funcione, você terá que reestruturar sua expressão de consulta em uma expressão que o Entity Framework possa manipular.
fonte
Expression<Func<T,type>>
é uma abordagem muito boa para isso.context.Where(IsSatisfied())
Recebi o mesmo erro neste código:
este foi exatamente o erro:
Eu resolvi assim:
Eu adicionei um .ToList () antes da minha tabela, isso desacopla a Entidade e o código linq e evito que minha próxima expressão linq seja traduzida
NOTA: esta solução não é a ideal, porque evita a filtragem de entidades e simplesmente carrega todas as tabelas na memória
fonte
Se alguém está procurando uma resposta VB.Net (como eu estava inicialmente), aqui está:
fonte
Tive um problema semelhante ao seu e esta documentação do LINQ me ajudou a encontrar as funções de string certas para contornar as limitações.
fonte