Dapper, ODATA et IQueryable dans ASP.NET

asp.net-mvc dapper iqueryable mvvm odata

Question

J'ai vu l'excellente performance de Dapper et quelques exemples d'utilisation.

Je me demandais si je pouvais l'utiliser pour fournir des données IQueryable et l'intégrer à une couche d'interface utilisateur utilisant ODATA pour transférer des données vers l'interface utilisateur (comme des grilles, des listes, etc.).

Existe-t-il un moyen de renvoyer les objets Dapper AsQueryable au lieu de IEnumerable pour interroger à l'aide d'ODATA?

Réponse acceptée

Non, pas vraiment. Eh bien, vous pouvez envelopper n'importe quelle séquence avec .AsQueryable () si vous le voulez vraiment, mais cela utilisera simplement LINQ-to-Objects. Dapper est délibérément simple; il essaie de faire très peu, mais ce que ça tente de faire: ça se damne bien (même si je le dis moi-même). Une interface IQueryable correcte est l'exact opposé de dapper ...


Réponse populaire

Je me suis récemment retrouvé dans cette situation où je voulais utiliser Dapper avec OData mais je ne voulais pas utiliser Entity Framework pour SQLite.

Ma solution était de créer une méthode d'extension pour ODataQueryOptions afin que mes contrôleurs ressemblent à ceci

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);
}

Cela semble simple et cela fonctionne pour moi jusqu'à maintenant, donc je le respecte. Je devais juste limiter ce que les utilisateurs peuvent filtrer en ce qui concerne 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
        };

Et voici la méthode d'extension

    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;
    }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi