[英]Creating an (Lambda) Expression using recursion
我有以下字典:
Dictionary<string, PropertyInfo> filterProperties;
該詞典的內容可以像這樣:
- "Language": [QueryData.Lang],
- "Id": [Querydata.UserId]
每個字符串鍵都映射到我的QueryData
類型的屬性。
現在,假設我有以下QueryData
實例:
QueryData: { Lang= "en", UserId = "mcicero" }
以上一個字典為例,我要構建以下表達式:
e => e.Language == "en" && e.Id == "mcicero";
如您所見,字典鍵用於訪問e
的屬性,而字典值(QueryData屬性)用於在二進制等式表達式中指定常量。
e
是Entity
類型,並保證具有此屬性。
結果表達式應為Expression<Func<Entity, bool>>
如何使用遞歸構建此表達式?
我之所以說遞歸,是因為它聽起來像是一種自然的解決方案,但最好使用迭代的解決方案。
我嘗試了迭代的替代方法,並最終得到了難看且不太容易理解的代碼。
但是,我無法為此問題創建遞歸方法。
無需創建單個表達式,只需將它們組合成一個迭代循環即可:
// For an IEnumerable<Expression> in "expressions"
Expression left = null;
foreach(var right in expressions)
{
if(left == null)
left = right;
else
left = Expression.And(left, right);
}
// Combined expression is in "left"
// Don't forget it will be null if there were no expressions provided...
或與LINQ一行:
var expr = expressions.Aggregate(Expression.And);
對於感興趣的人,只需一行:
Expression expr = filterProperties.Select(i => Expression.Equal(
Expression.Property(entityParameter, i.Key),
Expression.Constant(i.Value.GetValue(queryObj))
)).Aggregate(Expression.And);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.