簡體   English   中英

使用遞歸創建(Lambda)表達式

[英]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屬性)用於在二進制等式表達式中指定常量。

eEntity類型,並保證具有此屬性。

結果表達式應為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM