如何在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 ,如需转载请自行联系原作者

相关文章
|
5月前
|
存储 SQL
Structured Query
【7月更文挑战第13天】
37 4
|
开发框架 .NET C#
Language Integrated Query
欢迎来到本篇LINQ教程,本文介绍了如何使用C#中的LINQ(Language Integrated Query)。LINQ是C#中的功能,可用于从集合中检索,过滤和操作数据。
|
7月前
|
SQL 存储 关系型数据库
SQL(Structured Query Language)简介和常见 SQL 命令示例
SQL(Structured Query Language)是一种用于访问和操作关系型数据库的标准语言。它是一个功能强大的语言,用于执行各种数据库操作,包括检索数据、插入新记录、更新记录、删除记录、创建数据库、创建新表、设置权限以及执行存储过程和视图等。以下是 SQL 的一些重要方面:
88 0
|
开发框架 .NET C#
【C#】Language_Integrated_Query——LINQ
欢迎来到本篇LINQ教程,本文介绍了如何使用C#中的LINQ(Language Integrated Query)。LINQ是C#中的功能,可用于从集合中检索,过滤和操作数据。
|
缓存 Java
Elasticsearch Query DSL之Compound queries(复合查询)
Elasticsearch Query DSL之Compound queries(复合查询)
Elasticsearch Query DSL之Compound queries(复合查询)
|
算法 前端开发 调度
The Cascades Framework for Query Optimization
这篇paper是前一篇Volcano optimizer的后续,其涉及的概念和优化思路是一脉相承的,在阅读本篇之前,最好对Volcano optimizer有足够的了解,详见文章Volcano优化器框架。
583 0

热门文章

最新文章