LINQ to Entities no reconoce el método

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

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 statement 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> 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())); }