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)!