运用Linq中的LMAD表达式来进行综合查询

在编程过程中,我们经常用到多条件的查询,而且是多表.如果简单的用拼写,感觉有点麻烦.又不能像SQL语句那样传条件语句.这时我们就要运用到了LINQ中的LMAD表达式.

如有两表,学生表:Student ,成绩表Scores

 

public class Stuent
        {
            /// <summary>
            /// 姓名
            /// </summary>
            public string Name
            {
                set;
                get;
            }

            /// <summary>
            /// 生日
            /// </summary>
            public DateTime Birthday
            { set; get; }


            /// <summary>
            /// 地址
            /// </summary>
            public string Address
            {
                set;
                get;
            }
            /// <summary>
            /// 身份证
            /// </summary>
            public string CodeID
            {
                set;
                get;
            }

        }


        public class Scroes
        {
            /// <summary>
            /// 语文
            /// </summary>
            public decimal YuWen
            {
                set;
                get;
            }
            /// <summary>
            /// 数学
            /// </summary>
            public decimal ShuXue
            {
                set;
                get;
            }
            /// <summary>
            /// 英语
            /// </summary>
            public decimal YinYu
            {
                set;
                get;
            }
            /// <summary>
            /// 身份证号关联使用
            /// </summary>
            public string CodeID
            {
                set;get;
            }
        }


        private Expression<Func<T, bool>> GetContation<T>() where T :Stuent //这里的Student是指传递的类型为Student,比方多个地方继承了Student,这样就起到约束作用.
        {
            //初始定义返回条件,默认条件为真
            Expression<Func<T,bool>> expresstion =t =>true;
            //需要拼凑的条件
            Expression<Func<T, bool>> e = null;
            //这里就是加上各种条件判定了,假如界面上有一个文本框(txtName)
            if (!string.IsNullOrEmpty(txtName.Text))
            {
                e = p => p.Name.Equals(txtName.Text); //这里是把条件放到表达式为e的变量中
                //这里就是创建一个表达式了,并用用Parameters这样的传值方式,创建到expresstion变量中
                var invokedExr = Expression.Invoke(e, expresstion.Parameters.Cast<Expression>());
                //关联表达式,并运用条件传递
                expresstion = Expression.Lambda<Func<T,bool>>(Expression.And(expresstion.Body, invokedExr),expresstion.Parameters);
            }
            //身份证号不为空
            if (!string.IsNullOrEmpty(txtCodeID.Text))
            {
                e = p => p.CodeID.Equals(txtCodeID.Text);
                var invokedExp = Expression.Invoke(e, expresstion.Parameters.Cast<Expression>()); //这里的 expresstion.Parameters.Cast<Expression>() 起到转换为标准的表达式形式
                expresstion = Expression.Lambda<Func<T, bool>>(Expression.Add(expresstion.Body, invokedExp), expresstion.Parameters);

            }

 

            return expresstion;
        }

        private Expression<Func<T, bool>> GetContainterByScore<T>() where T : Scroes
        {
            Expression<Func<T, bool>> expression = t => true;
            Expression<Func<T, bool>> e = null;

            //这里比方说数学分数
            if (!string.IsNullOrEmpty(txtShuXue.Text))
            {
                e = p => p.ShuXue == decimal.Parse(txtShuXue.Text); //这里的方法不一定是等于
                var invokedExp = Expression.Invoke(e, expression.Parameters.Cast<Expression>());
                expression = Expression.Lambda<Func<T, bool>>(Expression.And(expression.Body, invokedExp), expression.Parameters);
            }
            //这里还可以加更多

            return expression;
        }


        //调用方法
        //运用了两个表cdx.Tbl_Students  cdx.Tbl_Scroes  这是运用DataContext可以产生的返回Table类型

        var result = cdx.Tbl_Students.Where(GetContation<Stuent>()).Join(cdx.Tbl_Scores.Where(GetContainterByScore<Scroes>()), st => st.CodeID, sc => sc.CodeID, (x, y) => x);
        //这是两表的内关联.也就是用Inner Join 来关联的,其中st是指Student表中何字段与Scores表中的何字段进行关联
        //sc 也就是关联字段,
        //(x,y)=>x 这是指两表关联,输出哪个表的内容,x代表第一个,y代表第二个,如果是两表都想输出,则是
        //(x,y)=>new {X=x,Y=y} 这样就是输出两表内容了

至于一个表,就把从Join那儿删除就可以了.

 

这是自己运用的一些看法,如有不当,请指正.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值