Supongamos que tengo un objeto entidad definida comoReutilizando LINQ to Expresión Entidades <Func <T, TResult> en Seleccionar y donde las llamadas
public partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
Basado en algunas propiedades de un artículo, necesito para determinar si el artículo se puede eliminar por un usuario dado. Entonces agrego un método estático para hacer la verificación. Algo así como:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
Así que ahora puede hacer
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Where(Article.CanBeDeletedBy(currentUserid));
}
Hasta aquí todo bien. Ahora quiero volver a utilizar la lógica en CanBeDeletedBy mientras se hace a Seleccione, algo así como:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
Pero no importa lo que intente, no puedo usar la expresión en el método de selección. Supongo que si puedo hacer
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
Entonces debería ser capaz de usar la misma expresión. Intentó compilar la expresión y llamarla haciendo
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = Article.CanBeDeletedBy(currentUserId).Compile()(a)
};
pero no funcionará tampoco.
¿Alguna idea sobre cómo hacer que esto funcione? O si no es posible, ¿cuáles son las alternativas para reutilizar la lógica comercial en ambos lugares?
Gracias
Pedro
La compilación de la expresión es la elección correcta y compila y funciona para mí. Si fuera yo, también tomaría en cuenta la compilación. Qué error estás recibiendo ? –
Sí, compila bien, pero arroja una excepción NotSupportedException: "LINQ to Entities no admite el tipo de nodo de expresión LINQ 'Invoke'." Intenté compilar la expresión fuera del Seleccionar en un Func y usarlo adentro, con el mismo resultado. –
Pedro
Por cierto, si uso un Func, y lo uso en el Donde el método, entonces la consulta se ejecutará en el cliente, que no es el propósito previsto. –
Pedro