自学内容网 自学内容网

Entity Framework扩展高级查询功能

需求:前端按照格式传递查询条件参数,后端自动解析。

前端参数格式:[{"f":"","v":"","o":"","t":"",}]。

参数f:参数名。

参数v:参数值。

参数o:=(默认)、<、<= 、>、>=、like、bt  指between。

参数t:搜索控件类型:tx:文本框 text(默认);ta:副文本框 textarea;tm:时间 time;dt:日期 date;dm:日期时间 datetime;dr:时间范围 daterang;sl:下拉选项 select。

例如想查询名称叫张三的:[{“f”:"name","val":"张三"}]

对应 的类结构:

public class TFilter
{
    /// <summary>
    /// field
    /// </summary>
    public string f { get; set; } //过滤的关键字
    /// <summary>
    /// value
    /// </summary>
    public string v { get; set; } //过滤的值



    /// <summary>
    ///操作符 operator
    ///=
    ///<
    ///<= 
    ///>
    ///>=
    ///like
    ///bt  指between
    /// </summary>
    public string o { get; set; }//

    /// <summary>
    /// 搜索控件类型
    /// tx:文本框 text
    /// ta:副文本框 textarea
    /// tm:时间 time
    /// dt:日期 date
    /// dm:日期时间 datetime
    /// dr:时间范围 daterang
    /// sl:下拉选项 select
    /// </summary>
    public string t { get; set; }

}

前端根据form表单生成查询参数(也可以自动根据需求实现)


/*序列化成[{f:"",v:"",o:""}],用于条件过滤
//2020-01-22
 */
Object.defineProperty(Object.prototype, 'toFilter', {
    configurable: true,
    enumerable: false,
    writable: false,
    value: function (o) {
        var json = [];
        var $form = this;
        var $array = $form.querySelectorAll("input,select,textarea,[name]");
        $array.forEach(function (item, index) {

            var $this = item;
            var type = item.type ? item.type.toLowerCase() : "div";

            var name = item.getAttribute("name");
            if (!name) {
                name = item.getAttribute("id");
            }

            if (!name) { return; }
            var targetName = item.nodeName;
            var val = item.value.trim();

            if (!val) {
                return;
            }
            if (targetName === "INPUT" || targetName === "SELECT" || targetName === "SELECT-ONE" || targetName === "SELECT-MULTEITY" || targetName === "TEXTAREA") {
                json.push({ "f": name, "v": val, "o": item.dataset.o ? item.dataset.o : "=", "t": item.dataset.t ? item.dataset.t : "tx" });
            }
        });
        return json;
    }
});

扩展Where方法

    public static ISugarQueryable<T> Where<T>(this IQueryable<T> query, TFilter[] filters,string LambdaParam ="c")
    {
        if (filters == null || filters.Length == 0)
        {
            return query;
        }
        var param = DynamicLinq.CreateLambdaParam<T>(LambdaParam);
        Expression body = Expression.Constant(true); //初始默认一个true
        foreach (var filter in filters)
        {
            Expression condition = param.GenerateBody<T>(filter);
            if (condition == null) continue;
            body = body.AndAlso(condition); //这里可以根据需要自由组合
        }
        var lambda = param.GenerateTypeLambda<T>(body); //最终组成lambda
        return query.Where(lambda);
    }

使用演示:

List<TFilter>   filters= ...;

 dbQuery.Where(filters);


原文地址:https://blog.csdn.net/dystocia/article/details/142519537

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!