Dapper, ODATA und IQueryable in ASP.NET

asp.net-mvc dapper iqueryable mvvm odata

Frage

Ich sah die großartige Leistung von Dapper und einige Beispiele, wie man es benutzt.

Ich habe mich gefragt, ob ich es verwenden kann, um IQueryable-Daten bereitzustellen und es mit der UI-Ebene zu integrieren, die ODATA verwendet, um Daten an die Benutzeroberfläche zu übertragen (wie Grids, Listen, ...).

Gibt es eine Möglichkeit, Dapper-Objekte AsQueryable anstelle von IEnumerable zurückzugeben, um ODATA abzufragen?

Akzeptierte Antwort

Nein nicht wirklich. Nun, Sie können jede Sequenz mit .AsQueryable () umbrechen, wenn Sie das wirklich wollen, aber es wird nur LINQ-to-Objects verwenden. Dapper ist absichtlich einfach; es versucht , nur sehr wenig zu tun, aber was es zu tun hat versuchen: es gut ist verdammt (auch wenn ich so selbst sage). Eine richtige IQueryable Schnittstelle ist das genaue Gegenteil von dapper ...


Beliebte Antwort

Ich fand mich kürzlich in dieser Situation, wo ich Dapper mit OData verwenden wollte, aber ich wollte Entity Framework für SQLite nicht verwenden.

Meine Lösung bestand darin, eine Erweiterungsmethode für ODataQueryOptions zu erstellen, damit meine Controller so aussehen würden

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

Das sieht einfach aus und es funktioniert soweit für mich, also bleibe ich dran. Ich musste nur einschränken, was Benutzer so weit wie odata filtern können

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

Und hier ist die Erweiterungsmethode

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum