如何解决Linq自定义组合查询?看起来似乎是个不太难的问题。但很多人仍然会卡在这里不知如何下手,今天我就用我的经历来给大家做一个例子。
创新互联建站 - 成都服务器托管,四川服务器租用,成都服务器租用,四川网通托管,绵阳服务器托管,德阳服务器托管,遂宁服务器托管,绵阳服务器托管,四川云主机,成都云主机,西南云主机,成都服务器托管,西南服务器托管,四川/成都大带宽,机柜大带宽租用·托管,四川老牌IDC服务商
当年,俺被误导,说是怎么实现Linq自定义组合捏?因为Linq是预编译滴,没有办法想拼一个sql字符串出来,让我纠结很久,但是,我觉得微软的人应该比较厉害,所以我本着“有困难要上,没有困难制造困难也要上”的原则,在还没有熟悉LINQ TO ADO.NET的情况下,我觉得决定在最近的我自己独立完成小项目里使用ASP.NET MVC + ADO.NET EF。
一般的信息系统都有一个组合查询的功能,我很快用jquery做了这样一个功能。
这个表单将Linq自定义组合条件提交后台,我先将它封装成条件对象的数组。
- ///
- /// 条件
- ///
- public class Condition
- {
- ///
- /// 字段
- ///
- public string Field { get; set; }
- ///
- /// 表达式
- ///
- public string Operator { get; set; }
- ///
- /// 值
- ///
- public string Value { get; set; }
- ///
- /// 关系
- ///
- public string Relation { get; set; }
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public static Condition[] BuildConditions(string[] fileds,string[] operators,string[] values,string[] relations)
- {
- if (fileds == null || operators == null || values == null || relations == null)
- {
- return null;
- }
- Condition[] conditions = new Condition[fileds.Length];
- try
- {
- for (int i = 0; i < conditions.Length; i++)
- {
- conditions[i] = new Condition()
- {
- Field = fileds[i],
- Operator = operators[i],
- Value = values[i],
- Relation = relations[i]
- };
- }
- }
- catch
- {
- return null;
- }
- return conditions;
- }
- }
#p#
实际上,编译器是把Linq自定义表达式编译成expression tree的形式,我只需要将条件对象数组转换为expression tree就可以了。
我先将一个条件转化为一个简单的expression。
- ///
- ///
- ///
- ///
- ///
- ///
- private static Expression ConditonToExpression(Condition condition,Expression parameter)
- {
- Expression expr = null;
- Type type = typeof(EDM_Resource);
- PropertyInfo pi = type.GetProperty(condition.Field);
- Expression left = Expression.Property(parameter, pi);
- object value = Convert.ChangeType(condition.Value, pi.PropertyType);
- Expression right = Expression.Constant(value);
- switch (condition.Operator)
- {
- case "=":
- expr = Expression.Equal(left, right);
- break;
- case "<":
- expr = Expression.LessThan(left, right);
- break;
- case "<=":
- expr = Expression.LessThanOrEqual(left, right);
- break;
- case ">":
- expr = Expression.GreaterThan(left, right);
- break;
- case ">=":
- expr = Expression.GreaterThanOrEqual(left, right);
- break;
- }
- return expr;
- }
#p#
然后组合,变成一个lamda表达式,追加到where上。
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public IList FindByGroup(EDM_ResGroup resGroup, Condition[] conditions, int first, int limit, out int count)
- {
- using (ShengjingEDM2Entities context = new ShengjingEDM2Entities())
- {
- IQueryable result = DoFindByGroup(resGroup, context);
- ParameterExpression parameter = Expression.Parameter(typeof(EDM_Resource), "r");
- Expression body = null;
- if (conditions != null && conditions.Length > 0)
- {
- body = ConditonToExpression(conditions[0], parameter);
- for (int i = 1; i < conditions.Length; i++)
- {
- Expression right = ConditonToExpression(conditions[i],parameter);
- body = conditions[i - 1].Relation.ToUpper().Equals("AND") ?
- Expression.And(body, right) :
- Expression.Or(body, right);
- }
- }
- if (body != null)
- {
- Expression bool>> expr = Expression.Lambda bool>>(body, parameter);
- result = result.Where (expr);
- }
- result = result.OrderByDescending int>(r => r.ResourceID);
- count = result.Count ();
- return result
- .Skip (first)
- .Take (limit)
- .ToList ();
- }
- }
原来Linq自定义这么强大,这么爽,比拼where条件的方法优雅多了,开发效率也是提高不少,而且我发现性能也不错,100万级的数据通过索引和分页查询还算可以。
分享标题:如何解决用户Linq自定义组合查询
网站链接:http://www.mswzjz.cn/qtweb/news33/151033.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能