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 en las que las personas obtienen el mismo error, y si lo entiendo 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. Todavía no he podido convertir mi escenario en algo que funcione, y mi cerebro está comenzando a derretirse, por lo que esperaba que alguien pudiera señalarme en la dirección correcta. Estamos usando Entity Framework y el patrón de especificación (y soy nuevo en 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ísame si necesitas más información.
Muchas gracias,
Annelie
Find()
cuando, cómo lo usaIsSatisfied()
dentro de él.Respuestas:
Como ha descubierto, Entity Framework no puede ejecutar su código C # como parte de su consulta. Tiene que poder convertir la consulta en 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.
fuente
Expression<Func<T,type>>
es un enfoque muy agradable para esto.context.Where(IsSatisfied())
Recibí el mismo error en este código:
este fue exactamente el error:
Resolví de esta manera:
Agregué un .ToList () antes de mi tabla, esto desacopla el código Entity y linq, y evita que mi próxima expresión linq se traduzca
NOTA: esta solución no es óptima, porque evita el filtrado de entidades y simplemente carga toda la tabla en la memoria
fuente
Si alguien está buscando una respuesta de VB.Net (como yo estaba inicialmente), aquí está:
fuente
Tuve un problema similar al tuyo y esta documentación de LINQ me ayudó a encontrar las funciones de cadena adecuadas para solucionar las limitaciones.
fuente