.net - LINQ to Entities no reconoce el método
entity-framework linq-to-entities (1)
Como has descubierto, Entity Framework no puede ejecutar tu código C # como parte de su consulta. Tiene que ser capaz de convertir la consulta a una declaración SQL real. Para que eso funcione, tendrá que reestructurar su expresión de consulta en una expresión que Entity Framework pueda manejar.
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
string name = this.charityName;
string referenceNumber = this.referenceNumber;
return p =>
(string.IsNullOrEmpty(name) ||
p.registeredName.ToLower().Contains(name.ToLower()) ||
p.alias.ToLower().Contains(name.ToLower()) ||
p.charityId.ToLower().Contains(name.ToLower())) &&
(string.IsNullOrEmpty(referenceNumber) ||
p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}
Recibo el siguiente error al intentar hacer una consulta de linq:
LINQ to Entities no reconoce el método ''Boolean IsCharityMatching (System.String, System.String)'', y este método no se puede traducir a una expresión de tienda.
He leído muchas preguntas anteriores donde las personas obtienen el mismo error, y si entiendo esto correctamente es porque LINQ to Entities requiere que toda la expresión de consulta linq se traduzca a una consulta del servidor, y por lo tanto no puede llamar a un método externo en eso. No he podido convertir mi escenario en algo que funciona todavía, y mi cerebro está empezando a derretirse, así que esperaba que alguien pudiera señalarme en la dirección correcta. Estamos utilizando Entity Framework y el patrón de especificación (y soy nuevo para ambos).
Aquí está el código que usa la especificación:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Aquí está la expresión linq:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Aquí está el 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;
}
Avíseme si necesita más información.
Muchas gracias,
Annelie