Dapper, ODATA e IQueryable en ASP.NET

asp.net-mvc dapper iqueryable mvvm odata

Pregunta

Vi el gran rendimiento de Dapper y algunas muestras de cómo usarlo.

Me preguntaba si puedo usarlo para proporcionar datos IQueryable e integrarlo con la capa UI usando ODATA para transferir datos a la IU (como cuadrículas, listas, ...).

¿Hay alguna manera de devolver los objetos Dapper AsQueryable en lugar de IEnumerable para consultar utilizando ODATA?

Respuesta aceptada

No en realidad no. Bueno, puedes ajustar cualquier secuencia con .AsQueryable () si realmente quieres, pero solo usará LINQ-to-Objects. Dapper es deliberadamente simple; que trata de hacer muy poco, pero lo que trato de hacer: no condenadamente bien (aunque me permite decirlo). Una interfaz IQueryable adecuada es exactamente lo contrario de apuesto ...


Respuesta popular

Recientemente me encontré en esta situación en la que quería usar Dapper con OData, pero no quería utilizar Entity Framework para SQLite.

Mi solución fue crear un método de extensión para ODataQueryOptions para que mis controladores se vieran así

public IHttpActionResult GetDevices(ODataQueryOptions<User> queryOptions)
{
    var usersQuery = new UserQuery(page, perPage);
    var users = usersQuery.Search(queryOptions.WhereClause(), queryOptions.OrderByClause());
    return Ok<IEnumerable<User>>(users);
}

Esto parece sencillo y me funciona hasta ahora, así que me estoy quedando con eso. Solo tenía que limitar lo que los usuarios pueden filtrar en lo que respecta a odata

    protected ODataValidationSettings _validationSettings =
        new ODataValidationSettings
        {
            // These validation settings prevent anything except: (equals, and, or) filter and sorting
            AllowedFunctions = AllowedFunctions.None,
            AllowedLogicalOperators = AllowedLogicalOperators.Equal | AllowedLogicalOperators.And | AllowedLogicalOperators.Or | AllowedLogicalOperators.NotEqual,
            AllowedArithmeticOperators = AllowedArithmeticOperators.None,
            AllowedQueryOptions = AllowedQueryOptions.Filter | AllowedQueryOptions.OrderBy
        };

Y aquí está el método de extensión

    public static string WhereClause(this ODataQueryOptions options)
    {
        string s = "";
        if (options.Filter != null && options.Filter.FilterClause != null)
        {
            var node = options.Filter.FilterClause.Expression as BinaryOperatorNode;
            s = getWhereClause(node);
        }
        return s;
    }

    private static string getWhereClause(BinaryOperatorNode node)
    {
        // PARSE FILTER CLAUSE
        // Parsing a filter, e.g. /Users?$filter=Id eq '1' or Id eq '100'  
        var s = "";
        if (node.Left is SingleValuePropertyAccessNode && node.Right is ConstantNode)
        {
            var property = node.Left as SingleValuePropertyAccessNode ?? node.Right as SingleValuePropertyAccessNode;
            var constant = node.Left as ConstantNode ?? node.Right as ConstantNode;

            if (property != null && property.Property != null && constant != null && constant.Value != null)
            {
                s += $" {property.Property.Name} {getStringValue(node.OperatorKind)} '{constant.Value}' ";
            }
        }
        else
        {
            if (node.Left is BinaryOperatorNode)
                s += getWhereClause(node.Left as BinaryOperatorNode);

            if (node.Right is BinaryOperatorNode)
            {
                s += $" {getStringValue(node.OperatorKind)} ";
                s += getWhereClause(node.Right as BinaryOperatorNode);
            }
        }
        return s;
    }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué