现在的位置: 首页 > 综合 > 正文

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

2013年10月18日 ⁄ 综合 ⁄ 共 3720字 ⁄ 字号 评论关闭

在编程过程中,我们经常用到多条件的查询,而且是多表.如果简单的用拼写,感觉有点麻烦.又不能像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那儿删除就可以了.

 

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

抱歉!评论已关闭.