Использование функции result внутри функции выражения, используемой предикатом - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь использовать предикатBuilder со следующим определением выражения, но я всегда получаю сообщение «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 основан на Monty's Gush "Универсальный PredicateBuilder"на http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/

Заранее спасибо

1 Ответ

0 голосов
/ 10 ноября 2011

Вы не можете этого сделать. Ваш puedeConsultar является функцией .NET. Вы не можете выполнять функции .NET в запросе Linq-to-entity. Когда вы используете метод в Linq-to-entity, вы можете использовать только методы, которые имеют прямое сопоставление с SQL. Это означает, что метод в запросе является только заполнителем, который транслируется для выполнения некоторой функции SQL. Существует набор предопределенных отображений методов, называемых каноническими функциями , и вы можете отобразить свою собственную функцию SQL при использовании EDMX, но в вашем случае вам, скорее всего, придется сначала загрузить данные в приложение с помощью ToList, а затем выполнить predicadoEstadoCorrectoSolicitud по материализованному результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...