FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 8058|回复: 1
打印 上一主题 下一主题

分享一个EF 动态Lambda表达式查询类

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-10 11:18:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 盼月亮 于 2015-1-10 13:44 编辑


自己用的EF动态查询,下拉框的条件是保存在数据库的,通过该类生成动态表达式查询。


/// <summary>
    /// 查询表达式
    /// </summary>
    public static class SearchExpression
    {
        private static Expression ConditonToExpression(SearchCondition condition, Expression parameter, Type type)
        {
            Expression expr = null;
            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;
                case "!=":
                    expr = Expression.NotEqual(left, right);
                    break;
            }
            return expr;
        }
        /// <summary>
        /// 按条件查询
        /// </summary>
        /// <typeparam name="T">实体模型</typeparam>
        /// <param name="conditions">过滤条件</param>
        /// <returns>表达式</returns>
        public static Expression<Func<T, bool>> FindByGroup<T>(List<SearchCondition> conditions)
        {
            ParameterExpression parameter = Expression.Parameter(typeof(T), "r");
            Expression body = null;
            Type type = typeof(T);
            if (conditions.Count > 0)
            {
                body = ConditonToExpression(conditions[0], parameter, type);
                for (int i = 1; i < conditions.Count; i++)
                {
                    Expression right = ConditonToExpression(conditions, parameter, type);
                    body = conditions[i - 1].Relation.ToUpper().Equals("AND") ?
                        Expression.And(body, right) :
                        Expression.Or(body, right);
                }
            }
            if (body != null)
            {
                Expression<Func<T, bool>> expr = Expression.
                    Lambda<Func<T, bool>>(body, parameter);
                return expr;
            }
            return null;
        }
    }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
沙发
发表于 2015-1-10 12:33:11 | 只看该作者
{:soso_e179:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|FineUI 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-10-21 07:21 , Processed in 0.044629 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表