我正在尝试将predicateBuilder与下一个表达式定义一起使用,但我总是得到消息 “LINQ to Entities无法识别方法'puedeConsultar'方法,并且此方法无法转换为商店表达式。” 我想我更了解这个问题,但我不知道如何解决它。
private static readonly IDictionary<int, List<string>> permisosAccesoSolicitudesEstado = new Dictionary<int, List<string>>(){{0, new List<string>(){"A"}}, {1, new List<string>(){"B"}}};
private static bool esPermisoConcedido(List<string> usuariosPermitidos, string erfilUsuario)
{
return usuariosPermitidos.Any(x => x.Equals(perfilUsuario) || perfilUsuario.StartsWith(x + "|") || perfilUsuario.EndsWith("|" + x));
}
public static bool puedeConsultar(int estadoActual, string perfilUsuario)
{
List<string> usuariosPermitidos = permisosAccesoSolicitudesEstado[estadoActual];
return esPermisoConcedido(usuariosPermitidos, perfilUsuario);
}
public static bool puedeConsultar(string estadoActual, string tipoUsuario)
{
return puedeConsultar(Convert.ToInt32(estadoActual), tipoUsuario);
}
public Expression<Func<Solicitud, Boolean>> predicadoEstadoCorrectoSolicitud(string perfil)
{
return x=> EstadosSolicitud.puedeConsultar(x.estado, perfil);
}
//Instantiated by reflection, this works fine
MethodInfo method = .....
Expression<Func<T, bool>> resultado = ConstructorPredicados.True<T>();
resultado = ConstructorPredicados.And(resultado, method);
objectSet.Where(resultado).ToList();
注意:
ConstructorPredicados位于http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/上的Monty's Gush“A universal PredicateBuilder”
提前致谢
答案 0 :(得分:0)
你做不到。您的puedeConsultar
是.NET函数。您无法在Linq-to-entities查询中执行.NET函数。在Linq-to-entities中使用方法时,只能使用直接映射到SQL的方法。这意味着查询中的方法只是占位符,它被转换为执行某些SQL函数。有一组名为cannonical functions的预定义方法映射,您可以在使用EDMX时映射自己的SQL函数,但在您的情况下,您很可能必须首先使用ToList将数据加载到应用程序,然后执行{{1}在物化结果上。