Lambda式接合
3352 ワード
CSDN広告はますます多くなって、すべてのブログのノートはもう更新しないで、新しいウェブサイトDotNetノート
クラスライブラリ:
使用方法1:
使用方法2:
クラスライブラリ:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace Mvc.Util
{
public class ParameterRebinder : ExpressionVisitor
{
private readonly Dictionary map;
public ParameterRebinder(Dictionary map)
{
this.map = map ?? new Dictionary();
}
public static Expression ReplaceParameters(Dictionary map, Expression exp)
{
return new ParameterRebinder(map).Visit(exp);
}
protected override Expression VisitParameter(ParameterExpression p)
{
ParameterExpression replacement;
if (map.TryGetValue(p, out replacement))
{
p = replacement;
}
return base.VisitParameter(p);
}
}
public static class LambdaHelper
{
public static Expression Compose(this Expression first, Expression second, Func merge)
{
var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] }).ToDictionary(p => p.s, p => p.f);
var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
return Expression.Lambda(merge(first.Body, secondBody), first.Parameters);
}
public static Expression> And(this Expression> first, Expression> second)
{
return first.Compose(second, Expression.And);
}
public static Expression> Or(this Expression> first, Expression> second)
{
return first.Compose(second, Expression.Or);
}
}
}
使用方法1:
TyMall.Entity.DbEntities db = new DbEntities();
Expression> expression = t => true;
expression = expression.And(t => t.id == 1);
expression = expression.And(t => t.sort > 1);
var rs=db.tb_advert.Where(expression);
使用方法2:
static void Main(string[] args)
{
//
List l = new List();
for (int i = 1; i <= 100; i++) {
Preson p = new Preson();
p.id = i;
p.age = i;
l.Add(p);
}
//
Expression> ex = t => true;
ex = ex.And(t => t.id >30);
ex = ex.And(t => t.age > 25);
ex = ex.And(t => t.age < 35);
// :AsQueryable
var rs =l.AsQueryable().Where(ex).ToList(); ;
foreach(Preson p in rs){
Console.WriteLine(p.id);
}
Console.Read();
}