小巧玲珑,ODATA和IQueryable的ASP.NET中(Dapper, ODATA, and

2019-09-20 07:54发布

我看到小巧玲珑的伟大业绩和怎样使用它的一些样品。

我在想,如果我可以用它来提供的IQueryable数据,并使用ODATA将数据传送到用户界面(如网格,列表,...),其与UI层进行整合。

有没有办法返回小巧玲珑对象AsQueryable已不是IEnumerable的使用ODATA查询?

Answer 1:

不,不是真的。 好了,你可以用与.AsQueryable()如果你真的想要的任何序列,但它也只是使用LINQ到对象。 小巧玲珑是故意简单; 它试图做的很少,但它什么尝试做:它不该死的好(即使我不这样说我自己)。 一个适当的IQueryable接口是短小精悍的完全相反...



Answer 2:

最近,我发现自己在这种情况下,我想用用小巧玲珑的OData,但我不希望使用实体框架的SQLite。

我的解决方案是创建一个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;
    }


Answer 3:

要使用OData的使用短小精悍,你将不得不拦截Get(ODataQueryOptions<SpotView> queryOptions)参数,分析它,并创建小巧玲珑的where子句出来。 您还需要考虑到在你的WebApiConfig.cs您有任何其他的OData设置

config.AddODataQueryFilter(new EnableQueryAttribute()
{
...
});

但是,你也可以使用的MySqlConnection与EF,你不必重新发明上述分析轮。 但是,那是你的决定,如果小巧玲珑的性能比使用一个完整的ORM喜欢EF已经有不同内置到它的执行更重要。



文章来源: Dapper, ODATA, and IQueryable in ASP.NET