entity-framework - epass - conexion a base de datos ado net c#
Paso de func como parĂ¡metro en Linq a Entidades y error ''1025'' del proveedor de datos de.NET Framework interno (1)
Tenemos una clase llamada Tarea:
public partial class Task : EntityObject
{
public EntityCollection<TaskUser> TaskUsers { get {...} set{...} }
}
Tiene una propiedad de navegación llamada TaskUsers, que contiene usuarios adjuntos a este taks:
public partial class TaskUser : EntityObject
{
public User User { get {...} set { } }
}
Cada objeto TaskUser tiene un objeto User.
Nos IQueryable<Task> tasks
. Queremos encontrar tareas asignadas al usuario con ID = 1. Cuando usamos
tasks.Where(t => t.TaskUsers.Any(a => a.User.ID == 1))
todo funciona bien Cuando usamos
Func<TaskUser, bool> function = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(function));
obtenemos un ''Internal .NET Framework Data Provider error 1025''
agradable ''Internal .NET Framework Data Provider error 1025''
. ¿Por qué? Quiero crear filtros mucho más complicados usando Expression
clase Expression
, pero si no puedo pasar Func
simple, esto no se puede hacer. ¿Qué tengo que hacer?
EDITAR
Tal vez
Func<TaskUser, bool> function = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(function));
no funciona, pero
Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.AsQueryable().Any(expression));
¡trabajos! Eso es todo lo que necesitaba.
Bueno, el EF solo puede traducir expresiones, no funciones.
es decir, puede traducir esto:
Expression<Func<TaskUser,bool>>
pero no esto:
Func<TaskUser,bool>
En cuanto a cómo combinar expresiones (en pseudo código):
Expression<Func<TaskUser, bool>> expression = a => a.User.ID == 1;
return tasks.Where(t => t.TaskUsers.Any(expression));
Probablemente hay algunos gurús de Expresión que pueden ayudar con eso.
Sugiero una pregunta de seguimiento centrada en ese problema particular
Alex