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

1,构造表达式树
如何在VS2008中的Language Integrated Query动态条件查询    private Expression<Func<Blog, bool>> getCondition()
如何在VS2008中的Language Integrated Query动态条件查询    
{
如何在VS2008中的Language Integrated Query动态条件查询        Expression
<Func<Blog, bool>> expression = blog => true;
如何在VS2008中的Language Integrated Query动态条件查询
如何在VS2008中的Language Integrated Query动态条件查询        
if (!String.IsNullOrEmpty(Request["BlogClassID"]))
如何在VS2008中的Language Integrated Query动态条件查询        
{
如何在VS2008中的Language Integrated Query动态条件查询            
int blogClassID;
如何在VS2008中的Language Integrated Query动态条件查询            
if (Int32.TryParse(Request["BlogClassID"], out blogClassID))
如何在VS2008中的Language Integrated Query动态条件查询            
{
如何在VS2008中的Language Integrated Query动态条件查询                Expression
<Func<Blog, bool>> e2 = blog => blog.BlogClass == null;
如何在VS2008中的Language Integrated Query动态条件查询                var invokedExpr 
= Expression.Invoke(e, expression.Parameters.Cast<Expression>());
如何在VS2008中的Language Integrated Query动态条件查询
如何在VS2008中的Language Integrated Query动态条件查询                expression 
= Expression.Lambda<Func<Blog, bool>>(Expression.And(expression.Body, invokedExpr), expression.Parameters);
如何在VS2008中的Language Integrated Query动态条件查询            }

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

如何在VS2008中的Language Integrated Query动态条件查询        
return expression;
如何在VS2008中的Language Integrated Query动态条件查询    }
主查询是这个样子:
如何在VS2008中的Language Integrated Query动态条件查询        var result = new DongBlogDataContext().Blogs.Where(getCondition());
如何在VS2008中的Language Integrated Query动态条件查询
因为根据SQL追踪,生成SQL类似:
如何在VS2008中的Language Integrated Query动态条件查询SELECT [t0].[BlogID][t0].[ChannelID][t0].[BlogClassID][t0].[Title][t0].[Content][t0].[Tag][t0].[CreateDateTime]
如何在VS2008中的Language Integrated Query动态条件查询
FROM [dbo].[Blog] AS [t0]
如何在VS2008中的Language Integrated Query动态条件查询
WHERE [t0].[BlogClassID] IS NULL
这种方法是实质是合并Lamba表达式,也就是这三句:
如何在VS2008中的Language Integrated Query动态条件查询                Expression<Func<Blog, bool>> e = blog => blog.BlogClass == null;
如何在VS2008中的Language Integrated Query动态条件查询                var invokedExpr 
= Expression.Invoke(e, expression.Parameters.Cast<Expression>());
如何在VS2008中的Language Integrated Query动态条件查询
如何在VS2008中的Language Integrated Query动态条件查询                expression 
= Expression.Lambda<Func<Blog, bool>>(Expression.And(expression.Body, invokedExpr), expression.Parameters);
如何在VS2008中的Language Integrated Query动态条件查询
如果每个条件合并都这么写会很麻烦,幸好已经有人给写好的辅助类:http://www.albahari.com/expressions/
如何在VS2008中的Language Integrated Query动态条件查询using System;
如何在VS2008中的Language Integrated Query动态条件查询
using System.Linq;
如何在VS2008中的Language Integrated Query动态条件查询
using System.Linq.Expressions;
如何在VS2008中的Language Integrated Query动态条件查询
using System.Collections.Generic;
如何在VS2008中的Language Integrated Query动态条件查询 
如何在VS2008中的Language Integrated Query动态条件查询
public static class PredicateBuilder
如何在VS2008中的Language Integrated Query动态条件查询
{
如何在VS2008中的Language Integrated Query动态条件查询  
public static Expression<Func<T, bool>> True<T> ()  return f => true;  }
如何在VS2008中的Language Integrated Query动态条件查询  
public static Expression<Func<T, bool>> False<T> () return f => false; }
如何在VS2008中的Language Integrated Query动态条件查询 
如何在VS2008中的Language Integrated Query动态条件查询  
public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
如何在VS2008中的Language Integrated Query动态条件查询                                                      Expression
<Func<T, bool>> expr2)
如何在VS2008中的Language Integrated Query动态条件查询  
{
如何在VS2008中的Language Integrated Query动态条件查询    var invokedExpr 
= Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
如何在VS2008中的Language Integrated Query动态条件查询    
return Expression.Lambda<Func<T, bool>>
如何在VS2008中的Language Integrated Query动态条件查询          (Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
如何在VS2008中的Language Integrated Query动态条件查询  }

如何在VS2008中的Language Integrated Query动态条件查询 
如何在VS2008中的Language Integrated Query动态条件查询  
public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
如何在VS2008中的Language Integrated Query动态条件查询                                                       Expression
<Func<T, bool>> expr2)
如何在VS2008中的Language Integrated Query动态条件查询  
{
如何在VS2008中的Language Integrated Query动态条件查询    var invokedExpr 
= Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
如何在VS2008中的Language Integrated Query动态条件查询    
return Expression.Lambda<Func<T, bool>>
如何在VS2008中的Language Integrated Query动态条件查询          (Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
如何在VS2008中的Language Integrated Query动态条件查询  }

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

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

如何在VS2008中的Language Integrated Query动态条件查询
如何在VS2008中的Language Integrated Query动态条件查询        
return query.OrderByDescending(blog => blog.CreateDateTime);
如何在VS2008中的Language Integrated Query动态条件查询    }
主查询
如何在VS2008中的Language Integrated Query动态条件查询var result = getQuery();
生成的SQL和第一个完全相同。

 

本文转自

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

上一篇:FirstResponder 释放问题


下一篇:Ajax验证码引出的问题:Strus2和Servlet耦合