在谓词使用的表达式函数内使用函数结果

时间:2011-11-09 14:38:30

标签: entity-framework entity-framework-4

我正在尝试将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”

提前致谢

1 个答案:

答案 0 :(得分:0)

你做不到。您的puedeConsultar是.NET函数。您无法在Linq-to-entities查询中执行.NET函数。在Linq-to-entities中使用方法时,只能使用直接映射到SQL的方法。这意味着查询中的方法只是占位符,它被转换为执行某些SQL函数。有一组名为cannonical functions的预定义方法映射,您可以在使用EDMX时映射自己的SQL函数,但在您的情况下,您很可能必须首先使用ToList将数据加载到应用程序,然后执行{{1}在物化结果上。