ASP.NETのDapper、ODATA、およびIQueryable

asp.net-mvc dapper iqueryable mvvm odata

質問

私はDapperの素晴らしいパフォーマンスとそれを使用する方法のサンプルを見ました。

私はIQueryableデータを提供するためにそれを使用でき、ODATAを使用してUIにデータを統合して(グリッド、リストなどのように)UIにデータを統合できるのかどうか疑問に思っていました。

ODATAを使用してクエリにIEnumerableの代わりにDapperオブジェクトAsQueryableを返す方法はありますか?

受け入れられた回答

いいえ、実際はありません。まあ、本当に必要ならば、.AsQueryable()で任意のシーケンスをラップできますが、LINQ-to-Objectsだけを使用します。 Dapperは故意に単純です。それは少ししかやろうとしませんが、それ何をしようとしますか:それは(たとえ私がそう言っても)うんざりします。適切なIQueryableインターフェイスは、dapperとまったく逆です...


人気のある回答

私は最近、OpperでDapperを使いたいと思ったが、SQLiteのためにEntity Frameworkを使いたくないという状況になった。

私のソリューションは、ODataQueryOptionsの拡張メソッドを作成して、コントローラをこのように見せることでした

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

これは簡単に見えますが、それは今のところ私のために働くので、私はそれに固執しています。 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
        };

そして、ここに拡張メソッドがあります

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ