【IT168技术文档】
1,构造表达式树
主查询是这个样子:private Expression<Func<Blog, bool>> getCondition() { Expression<Func<Blog, bool>> expression = blog => true; if (!String.IsNullOrEmpty(Request["BlogClassID"])) { int blogClassID; if (Int32.TryParse(Request["BlogClassID"], out blogClassID)) { Expression<Func<Blog, bool>> e2 = blog => blog.BlogClass == null; var invokedExpr = Expression.Invoke(e, expression.Parameters.Cast<Expression>()); expression = Expression.Lambda<Func<Blog, bool>>(Expression.And(expression.Body, invokedExpr), expression.Parameters); } } return expression; }
因为根据SQL追踪,生成SQL类似:var result = new DongBlogDataContext().Blogs.Where(getCondition());
这种方法是实质是合并Lamba表达式,也就是这三句:SELECT [t0].[BlogID], [t0].[ChannelID], [t0].[BlogClassID], [t0].[Title], [t0].[Content], [t0].[Tag], [t0].[CreateDateTime] FROM [dbo].[Blog] AS [t0] WHERE [t0].[BlogClassID] IS NULL
Expression<Func<Blog, bool>> e = blog => blog.BlogClass == null; var invokedExpr = Expression.Invoke(e, expression.Parameters.Cast<Expression>()); expression = Expression.Lambda<Func<Blog, bool>>(Expression.And(expression.Body, invokedExpr), expression.Parameters);