.net linq entity-framework linq-to-entities specification-pattern

.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