---------------------------------------------快速適用
效果:
where name like '%王%' and Age>=35 or Age<10
構(gòu)建表達(dá)式樹:(快速式)
1.添加命名空間:
using System.Linq.Expressions;
2.聲明參數(shù)表達(dá)式(比如Book實(shí)體)
?ParameterExpression param = Expression.Parameter(typeof(Book));
3.
Expression exp = Expression.Constant(true);初始化表達(dá)式樹;
4.通過反射機(jī)制調(diào)用string.Contains,構(gòu)建like;
var methodinfo = typeof(string).GetMethod("Contains");
5.拼接
//Expression.And:表示 and 后面的條件當(dāng)然還有Or、 >=、<=、=等
//exp:and前面的語句,拼接之前的語句;
//Expression.Call():方法調(diào)用表達(dá)式;
//Expression.Property(param, "Name")字段或?qū)傩员磉_(dá)式
//methodinfo:調(diào)用上面Contains方法;
//Expression.Constant(s1):常量表達(dá)式;s1=“王”;
exp = Expression.And(exp, Expression.Call(Expression.Property(param, "Name"),methodinfo, Expression.Constant(s1)));
exp = Expression.And(exp, Expression.GreaterThanOrEqual(Expression.Property(param, "Id"),Expression.Constant(35)));
exp = Expression.Or(exp, Expression.LessThan(Expression.Property(param, "Id"), Expression.Constant(10)));
6.描述lambda表達(dá)式
var lam = Expression.Lambda<Func<Book, bool>>(exp, param);
7.調(diào)用
var lis = books.Where<Book>(lam).ToList();
?
------------------------------------------------------------詳細(xì)(轉(zhuǎn)述網(wǎng)友秦迷)
//---------------動(dòng)態(tài)創(chuàng)建表達(dá)式目錄樹---------------//
//名字模糊查詢tony
//年齡大于等于20
//年齡小于30
string uname = "tony";
List<Expression> expList = new List<Expression>(2);
ParameterExpression parExp = Expression.Parameter(typeof(UserInfo), "infos");//創(chuàng)建需要查找的參數(shù)
?
//查姓名infos.UserName.Contains("tony")
MemberExpression unameExp = Expression.Property(parExp, "UserName");
MethodInfo containsMethod = typeof(string).GetMethod("Contains");//using System.Reflection;指定實(shí)現(xiàn)Contains方法
ConstantExpression unamevalueExp = Expression.Constant(uname, typeof(string));
MethodCallExpression containsExp = Expression.Call(unameExp, containsMethod, unamevalueExp);
expList.Add(containsExp);
?
//查年齡infos.Age>=20
MemberExpression age1 = Expression.Property(parExp, "Age");
ConstantExpression agevalue1 = Expression.Constant(20, typeof(int));
BinaryExpression gteExp = Expression.GreaterThanOrEqual(age1, agevalue1);
expList.Add(gteExp);
//查年齡infos.Age<30
//if (1 > 2)
//{
MemberExpression age2 = Expression.Property(parExp, "Age");
ConstantExpression agevalue2 = Expression.Constant(30, typeof(int));
BinaryExpression ltExp = Expression.LessThan(age2, agevalue2);
expList.Add(ltExp);
//}
?
?
//把上面的表達(dá)式連接起來
Expression whereExp = null;
foreach (var item in expList)
??? {
??????? if (whereExp == null)
??????????????? {
??????????????????? whereExp = item;
??????????????? }
??????????????? else
??????????????? {
??????????????????? whereExp = Expression.And(whereExp, item);
??????????????????? /*
???????????????????? * 出錯(cuò)信息:
???????????????????? * 沒有為類型“System.Boolean”和“System.Boolean”定義二進(jìn)制運(yùn)算符 Add。
???????????????????? * 是And,開始我寫錯(cuò)成了Add一直找不到原因
??????????????????? ?*/
??????????????? }
??????????? }
//生成Lambda表達(dá)式
//Expression<Func<UserInfo, bool>> lambda = Expression.Lambda<Func<UserInfo, bool>>(whereExp, parExp);
LambdaExpression lambda = Expression.Lambda<Func<UserInfo, bool>>(whereExp, parExp);
Console.WriteLine(lambda);
/*
* 生成結(jié)果:
* infos => ((infos.UserName.Contains("tony") And (infos.Age>=20)) And (infos.Age<30))
*/
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
