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.OrElse(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.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}
//上面是一个构造表达式树的类
public static IQueryable<HR_Company_Position> GetHR_Company_PositionByKeyWords(string keyword)
{
try
{
if (!string.IsNullOrEmpty(keyword))
{
//Expression<Func<Product, bool>> expr = n => GetCondintion(n); var list = dal.GetHR_Company_Position();
var keyarry = keyword.Split(' ', '/'); var predicate = PredicateBuilder.False<HR_Company_Position>(); foreach (var s in keyarry)
{
var temp = s.Trim();
predicate = predicate.Or(p => p.Position.Contains(temp));
} return list.Where(predicate).Select(p => p).Distinct();
}
else
{
return dal.GetHR_Company_Position();
}
}
catch
{
return null;
}
}
//这里是调用的方法但是我将构造表达树的类放到 一个common 类库里 却出现问题
predicate = predicate.Or(p => p.Position.Contains(temp));
这个Or方法不会出现。但是放在同一个cs文件却没问题。。
请教大家
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.OrElse(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.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}这是一个静态的扩展类。如果我将他放到common(自己写的库)里,然后编译成dll。之后在另外一个库(bll库吧)引用。
然后在一个bll类里调用
public static IQueryable<HR_Company_Position> GetHR_Company_PositionByKeyWords(string keyword)
{
try
{
if (!string.IsNullOrEmpty(keyword))
{
//Expression<Func<Product, bool>> expr = n => GetCondintion(n); var list = dal.GetHR_Company_Position();
var keyarry = keyword.Split(' ', '/'); var predicate = PredicateBuilder.False<HR_Company_Position>(); foreach (var s in keyarry)
{
var temp = s.Trim();
predicate = predicate.Or(p => p.Position.Contains(temp));
} return list.Where(predicate).Select(p => p).Distinct();
}
else
{
return dal.GetHR_Company_Position();
}
}
catch
{
return null;
}
}
//这里是调用的方法这种操作 会出问题。而我将 静态的扩展类 放在 bll库里。却没问题
ASP.NET WebForm和ASP.NET MVC分页最终解决之道
predicate = predicate.AndAlso(p => p.CompanyName.Length > 2)
.OrElse((Products p) => p.ProductName.Contains("c"))
.AndAlso((Products p) => p.UnitPrice >= 22);
{
var temp = s.Trim();
predicate = predicate.Or(p => p.Position.Contains(temp));
}就是 predicate = predicate.Or(p => p.Position.Contains(temp));
说没有Or这个方法
这时是放在另外一个库的。。
5楼的大哥想告诉我怎样用这个类吗?
正解,你为引用Common命名空间,当然完整的命名空间只有你自己知道。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;namespace FPD.Common
{
public static class PredicateBuilderClass
{
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.OrElse(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.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
}
}}
写到另外的库的 生成类
但是不知道为什么现在又可以啦。。之前生成n多次都是不行的。。
谢谢啊