如何在VS2008中的Language Integrated Query动态条件查询

简介:
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;
    }
主查询是这个样子:
        var result  =   new  DongBlogDataContext().Blogs.Where(getCondition());
因为根据SQL追踪,生成SQL类似:
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
这种方法是实质是合并Lamba表达式,也就是这三句:
                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);
如果每个条件合并都这么写会很麻烦,幸好已经有人给写好的辅助类: http://www.albahari.com/expressions/
using  System;
using  System.Linq;
using  System.Linq.Expressions;
using  System.Collections.Generic;
 
public   static   class  PredicateBuilder
{
  
public static Expression<Func<T, bool>> True<T> ()  return f => true;  }
  
public static Expression<Func<T, bool>> False<T> () return f => false; }
 
  
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
                                                      Expression
<Func<T, bool>> expr2)
  
{
    var invokedExpr 
= Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
    
return Expression.Lambda<Func<T, bool>>
          (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
  }

 
  
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
                                                       Expression
<Func<T, bool>> expr2)
  
{
    var invokedExpr 
= Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
    
return Expression.Lambda<Func<T, bool>>
          (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
  }

}

这个类可以用于Expression<Func<T, bool>>类型的表达式的合并了。具体用法参看 http://www.albahari.com/expressions/http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1745163&SiteID=1
2,构造Query
同第一种查询更好的写法:
     private  IQueryable < Blog >  getQuery()
    
{
        IQueryable
<Blog> query = new DongBlogDataContext().Blogs;
        
if (!String.IsNullOrEmpty(Request["BlogClassID"]))
        
{
            
int blogClassID;
            
if (Int32.TryParse(Request["BlogClassID"], out blogClassID))
                query 
= query.Where<Blog>(blog => blog.BlogClass == null);
        }


        
return query.OrderByDescending(blog => blog.CreateDateTime);
    }
主查询
var result  =  getQuery();
生成的SQL和第一个完全相同。

 

本文转自

高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196448 ,如需转载请自行联系原作者

目录
打赏
0
0
0
0
96
分享
相关文章
|
21天前
基于Reactor模型的高性能网络库之Channel组件篇
Channel 是事件通道,它绑定某个文件描述符 fd,注册感兴趣的事件(如读/写),并在事件发生时分发给对应的回调函数。
134 60
五更转曲(转载)
  1645年,北国沦丧,南地亦危在旦夕。清朝大军攻陷南京之后转攻江阴县,原本的守土吏,早已降的降、逃的逃。汉人不甘就如此屈服于满人铁骑下,于是江阴县人推举崇祯年间仅凭一人之力成功击退海上强盗的昔时县典史阎应元作为守城大将。
1009 0
Qwen3接入VSCode实现自动编程:Cursor平替方案
Cursor平替!阿里云开源全新AI编程大模型Qwen3-Coder,全面支持通义灵码。功能强大、免费使用,无需邀请码,兼容VSCode、JetBrains等主流开发环境,显著提升编程效率。
627 0
Qwen3接入VSCode实现自动编程:Cursor平替方案
参加大模型安全撬壳计划的一点心得
本文分享了作者在参与LLM及多模模型实践中的经验与心得,涵盖代码编写、多轮对话处理、本地模拟交互、越狱方法等内容,并提供了多个实用代码示例与策略建议。同时总结了对模型评分与文档支持的改进建议,适合对LLM应用与对抗攻击感兴趣的开发者与研究者参考。
599 2
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等