当前位置:首页 > 开发教程 > 数据库 >

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的

时间:2013-05-06 17:44 来源: 作者: 收藏

本系列文章导航

Linq To Sql进阶系列(一)从映射讲起

Linq To Sql进阶系列(二)M:M关系

Linq To Sql进阶系列(三)CUD和Log

Linq To Sql进阶系列(四)User Define Function篇

Linq To Sql进阶系列(五)Store Procedure篇

Linq To Sql进阶系列(六)用object的动态查询与保存log篇

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别

在上面一篇文章Linq To Sql进阶系列(六)中,我们提到了使用object的动态查询。本文在上文的基础上,再做更加深入的引申。同时修正上文中一些不妥的地方。

1, object的动态查询续
首先要做的事情,就是将Find的函数改成扩展方法。扩展方法只能放在静态类里,而且它的第一个参数必须带this关键字。在上文中,作者留下了一个迷题。当需要or条件时,又该如何做呢?本文也将这个问题给出回答。但是对于动态Like的条件,笔者依然还没有找到一个较好的方法。为了增加or条件,函数的声明也再一次被改动。如下:
    public static IQueryable<TEntity> Find<TEntity>(this IQueryable<TEntity> source, TEntity obj, bool isAnd) where TEntity : class
在上文中,我们还碰到了System.Nullable<int>此类类型不支持的问题。其实这个地方主要原因在于我们构造right端的Expression Tree时,没有给它参数。那么这个问题通过Expression right = Expression.Constant(p.GetValue(obj, null), p.PropertyType); 可以得到修复。那整个函数修改后,如下:

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的    public static IQueryable<TEntity> Find<TEntity>(this IQueryable<TEntity> source, TEntity obj,
bool
 isAnd) where TEntity : class
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的    
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
if (source == null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            
throw new ArgumentNullException("Source can't be null!!");
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
//获得所有property的信息
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
        PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Public |
BindingFlags.Instance);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        Expression condition 
= null;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
//先构造了一个ParameterExpression对象,这里的c,就是Lambda表达中的参数。(c=>)  
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
//本变量被移出了foreach循环
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
        ParameterExpression param = Expression.Parameter(typeof(TEntity), "c");
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
//遍历每个property
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
        foreach (PropertyInfo p in properties)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            
if (p != null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                Type t 
= p.PropertyType;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                
//只支持value型和string型的影射
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                if (t.IsValueType || t == typeof(string))
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                    
//如果不为null才算做条件
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                    if (p.GetValue(obj, null!= null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                    
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
//SQL Server does not support comparison of TEXT, NTEXT, XML and IMAGE ,etc
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                        ///Only support BigInt,Bit,Char,Decimal,Money,NChar,Real,
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
///Int,VarChar,SmallMoney,SmallInt,NVarChar,NVarChar(MAX),VarChar(MAX)

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        Attribute attr = Attribute.GetCustomAttribute(p, typeof(ColumnAttribute));
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
if (attr != null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            
string dbType = (attr as ColumnAttribute).DbType;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            
if (dbType.Contains("Text"|| dbType.Contains("NText")
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                
|| dbType.Contains("Xml"|| dbType.Contains("Image")
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                
|| dbType.Contains("Binary"|| dbType.Contains("DateTime")
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                
|| dbType.Contains("sql_variant"|| dbType.Contains("rowversion")
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                
|| dbType.Contains("UniqueIdentifier"|| dbType.Contains
(
"VarBinary(MAX)"))
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                
continue;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        }
 
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
//构造表达式的右边,值的一边
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                        Expression right = Expression.Constant(p.GetValue(obj, null), p.PropertyType);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
//构造表达式的左边,property一端。
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                        Expression left = Expression.Property(param, p.Name);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
//生成筛选表达式。即c.CustomerID == "Tom"
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的
                        Expression filter = Expression.Equal(left, right);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
if (condition == null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            condition 
= filter;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
else
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            
if (isAnd)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                condition 
= Expression.And(condition, filter);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                            
else
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                                condition 
= Expression.Or(condition, filter);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                        }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                    }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的                }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
if (condition != null)
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
{
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            Expression
<Func<TEntity, bool>> pred = Expression.Lambda<Func<TEntity, bool>>(condition, param);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的            
return source.Where(pred);
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        }
  
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
return source;
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的        
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的    }

Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的    

继续>>下一页 [第1页][第2页][第3页][第4页] 0 0  

数据库阅读排行

最新文章