網(wǎng)站首頁 編程語言 正文
C#動(dòng)態(tài)創(chuàng)建lambda表達(dá)式
近日在使用了一下EF框架,在做多條件where查詢的時(shí)候不知道怎么做,網(wǎng)上找了找,一開始用context.Database.SqlQuery<T>方法寫sql語句,之后遇到了SqlParamterCollection已在另一定義的問題,找了一下,大概知道什么問題,覺得用EF真的有點(diǎn)不方便,還不如用Dapper開發(fā)效率快,之后又在網(wǎng)上搜了搜關(guān)鍵字EF框架多條件Where查詢就打開了新世界的大門。
動(dòng)態(tài)創(chuàng)建lambda表達(dá)式,我跟著學(xué)習(xí)了一下寫的
代碼如下:
? ? ? ? ? ?//querydata 是Dictionary<string,string> 放著要查詢的屬性名和相應(yīng)的值
? ? ? ? ? ? ParameterExpression pe = Expression.Parameter(typeof(Customer), "customer");//lambda表示式里的參數(shù)我這邊是單參數(shù)
? ? ? ? ? ? Expression left;//相當(dāng)于 a=b 的 a
? ? ? ? ? ? Expression right;//相當(dāng)于a=b 的 b
? ? ? ? ? ? Expression e;//作為最后形成的表達(dá)式的載體
? ? ? ? ? ? //先放一個(gè)初始值后面被替換不然循環(huán)里不方便用 ? ? ? ? ??
? ? ? ? ? ? left = Expression.Property(pe, typeof(Customer).GetProperty("name"));//Customer.name
? ? ? ? ? ? right = Expression.Constant("巔峰白楊");//Constant方法設(shè)置屬性對應(yīng)的值
? ? ? ? ? ? e = Expression.Equal(left, right);//Customer.name=="巔峰白楊"
? ? ? ? ? ? //循環(huán)查詢條件字典
? ? ? ? ? ? ?foreach (var item in querydata)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (!item.Value.ToString().Trim().Equals(""))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? left = Expression.Property(pe, typeof(SFC_Package).GetProperty(item.Key));
? ? ? ? ? ? ? ? ? ? right = Expression.Constant(item.Value);
? ? ? ? ? ? ? ? ? ? if (index == 0)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? e = Expression.Equal(left, right);
? ? ? ? ? ? ? ? ? ? ? ? index++;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? if (e != null)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? Expression tempe;
? ? ? ? ? ? ? ? ? ? ? ? ? ? tempe = Expression.Equal(left, right);
? ? ? ? ? ? ? ? ? ? ? ? ? ? e = Expression.And(tempe, e);//加了一個(gè)&&連接兩個(gè)判斷
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ??
? ? ? ? ? ? IQueryable<Customer> queryableData = db.Customer.AsQueryable<Customer>();//將IEnumerable類型轉(zhuǎn)成IQueryable ? ? ? ? ??
? ? ? ? ? ? //Where方法的lambda表達(dá)式
? ? ? ? ? ? MethodCallExpression whereCallExpression = Expression.Call(
? ? ? ? ? ? typeof(Queryable),
? ? ? ? ? ? "Where",
? ? ? ? ? ? new Type[] { queryableData.ElementType },
? ? ? ? ? ? queryableData.Expression,
? ? ? ? ? ? Expression.Lambda<Func<SFC_Package, bool>>(e, new ParameterExpression[] { pe }));
? ? ? ? ? ? //OrderBy方法的lambda表達(dá)式 這邊寫的有點(diǎn)冗余第一次寫不太習(xí)慣,想想重復(fù)了很多
? ? ? ? ? ? var propertyinfo=typeof(Customer).GetProperty("Name");
? ? ? ? ? ? Expression body=Expression.Property(pe,propertyinfo);
? ? ? ? ? ? Type nametype=propertyinfo.PropertyType;
? ? ? ? ? ? MethodCallExpression orderByCallExpression = Expression.Call(
? ? ? ? ? ? ?typeof(Queryable),
? ? ? ? ? ? "OrderBy",
? ? ? ? ? ? new Type[] { queryableData.ElementType, nametype},//其實(shí)可以寫成queryableData.ElementType.GetProperty("Name").PropertyType ? ? ? ? ? ?
? ? ? ? ? ? whereCallExpression,
? ? ? ? ? ? Expression.Lambda(body, pe));
? ? ? ? ? ? //使用已創(chuàng)建好的lambda表達(dá)式查詢數(shù)據(jù) ps:IQueryable和IEnumerable可以轉(zhuǎn)換方便處理查詢結(jié)果
? ? ? ? ? ? ?IQueryable<SFC_Package> results = queryableData.Provider.CreateQuery<Customer>(orderByCallExpression);
網(wǎng)上還看到一種簡單的多條件查詢的方法,相當(dāng)于
var data=db.Customer.Where(o=>o.name=="西門吹雪");
data=data.Where(o=>o.sex="男神")
用循環(huán)來多次Where實(shí)現(xiàn)多條件查詢,感覺可能會(huì)造成多次數(shù)據(jù)庫查詢,不過用在Linq to Object
上應(yīng)該挺好的。
最后學(xué)習(xí)的動(dòng)態(tài)創(chuàng)建lambda表達(dá)式地址 點(diǎn)擊打開鏈接
Lambda表達(dá)式動(dòng)態(tài)拼接生成工具類
public static class LambdaUtil<T>
{
/// <summary>
/// lambda表達(dá)式:t=>true
/// </summary>
/// <returns></returns>
public static Expression<Func<T, bool>> True()
{
return t => true;
}
/// <summary>
/// lambda表達(dá)式:t=>false
/// </summary>
/// <returns></returns>
public static Expression<Func<T, bool>> False()
{
return t => false;
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName
/// 多用于order排序
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <typeparam name="TKey">返回類型</typeparam>
/// <param name="propName">屬性名</param>
/// <returns></returns>
private static Expression<Func<T, TKey>> Order<TKey>(string propName)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)屬性
MemberExpression property = Expression.Property(parameter, propName);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, TKey>>(property, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName==propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Equal(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)相等比較Expression
BinaryExpression binary = Expression.Equal(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName!=propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> NotEqual(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)不相等比較Expression
BinaryExpression binary = Expression.NotEqual(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName<propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> LessThan(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)不相等比較Expression
BinaryExpression binary = Expression.LessThan(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName<=propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> LessThanOrEqual(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)不相等比較Expression
BinaryExpression binary = Expression.LessThanOrEqual(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName>propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> GreaterThan(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)不相等比較Expression
BinaryExpression binary = Expression.GreaterThan(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName>=propValue
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> GreaterThanOrEqual(string propName, object propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue);
// 創(chuàng)建一個(gè)不相等比較Expression
BinaryExpression binary = Expression.GreaterThanOrEqual(member, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>{t.contains(propvalue1) ||...||t.contains(propvalueN)}
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValues">屬性值數(shù)組</param>
/// <returns></returns>
public static Expression<Func<T, bool>> In(string propName, string[] propValues)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t"); // left
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
Expression constant = Expression.Constant(false);
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
foreach (string item in propValues)
{
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right
// 連接參數(shù)方法
constant = Expression.Or(methodCall, constant);
}
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(constant, new ParameterExpression[] { parameter });
}
/// <summary>
/// lambda表達(dá)式:t=>{!(t.contains(propvalue1) ||...||t.contains(propvalueN))}
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValues">屬性值數(shù)組</param>
/// <returns></returns>
public static Expression<Func<T, bool>> NotIn(string propName, string[] propValues)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
Expression constant = Expression.Constant(false);
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
foreach (string item in propValues)
{
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, Expression.Constant(item)); // right
// 連接參數(shù)方法
constant = Expression.Or(methodCall, constant);
}
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(Expression.Not(constant), new ParameterExpression[] { parameter });
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName.Contains(propValue)
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Contains(string propName, string propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue, typeof(string));
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName.Contains(propValue)
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> StartWith(string propName, string propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue, typeof(string));
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>t.propName.Contains(propValue)
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> EndsWith(string propName, string propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue, typeof(string));
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("EndsWith", new[] { typeof(string) });
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(methodCall, parameter);
}
/// <summary>
/// lambda表達(dá)式:!(t=>t.propName.Contains(propValue))
/// 多用于where條件
/// </summary>
/// <typeparam name="T">參數(shù)類型</typeparam>
/// <param name="propName">屬性名稱</param>
/// <param name="propValue">屬性值</param>
/// <returns></returns>
public static Expression<Func<T, bool>> NotContains(string propName, string propValue)
{
// 創(chuàng)建節(jié)點(diǎn)參數(shù)t
ParameterExpression parameter = Expression.Parameter(typeof(T), "t");
// 創(chuàng)建一個(gè)成員(字段/屬性)
MemberExpression member = Expression.PropertyOrField(parameter, propName);
// 創(chuàng)建一個(gè)常數(shù)
ConstantExpression constant = Expression.Constant(propValue, typeof(string));
// 創(chuàng)建一個(gè)方法
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
// 創(chuàng)建一個(gè)帶參數(shù)方法Expression
MethodCallExpression methodCall = Expression.Call(member, method, constant);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(Expression.Not(methodCall), parameter);
}
/// <summary>
/// lambda表達(dá)式:t=>{left and right}
/// 多用于where條件
/// </summary>
/// <param name="left">左側(cè)條件</param>
/// <param name="right">右側(cè)條件</param>
/// <returns></returns>
public static Expression<Func<T, bool>> And(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
// 創(chuàng)建參數(shù)表達(dá)式
InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());
// 創(chuàng)建and運(yùn)算
BinaryExpression binary = Expression.And(left.Body, invocation);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);
}
/// <summary>
/// lambda表達(dá)式:t=>{left or right}
/// 多用于where條件
/// </summary>
/// <param name="left">左側(cè)條件</param>
/// <param name="right">右側(cè)條件</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Or(Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
// 創(chuàng)建參數(shù)表達(dá)式
InvocationExpression invocation = Expression.Invoke(right, left.Parameters.Cast<Expression>());
// 創(chuàng)建or運(yùn)算
BinaryExpression binary = Expression.Or(left.Body, invocation);
// 生成lambda表達(dá)式
return Expression.Lambda<Func<T, bool>>(binary, left.Parameters);
}
}
總結(jié)
原文鏈接:https://blog.csdn.net/qq_33961062/article/details/80223101
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-05-13 this.$route.params獲取不到
- 2024-03-07 SpringAOP基于XML方式實(shí)現(xiàn)(了解)
- 2022-05-20 Spring JdbcTemplate 快速上手
- 2022-06-06 SpringBoot、SpringCloud、SpringCloudAlibaba的版本對應(yīng)關(guān)系
- 2022-06-22 C#操作ini文件的幫助類_C#教程
- 2023-10-10 函數(shù)柯里化的簡單實(shí)現(xiàn)和應(yīng)用
- 2022-03-21 golang?調(diào)用c語言動(dòng)態(tài)庫方式實(shí)現(xiàn)_Golang
- 2023-07-09 Python Django 零基礎(chǔ)從零到一部署服務(wù),Hello Django!全文件夾目錄和核心代碼
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支