我想創建通過查詢獲取項目的存儲庫模式類。不幸的是我需要將這個查詢從一個類解析到另一個類(Picture to ListItem)以將其發送到服務器(api)。所以,我的代碼應該看起來像如下:將表達式<Func <XClass,object >>轉換爲表達式<Func <YClass,object >>
public static void ConvertQuery(Expression<Func<Picture, object>> oldQuery)
{
Expression<Func<ListItem, object>> newQuery = convert(oldQuery);
}
而且,例如,我想舊的查詢通過編制屬性像下面轉換:
- SomePicture.Id => SomeListItem.Id
- SomePicture .FileName => SomeListItem [「FileName」]
我發現了一些解決方案,我可以投射屬性。但最大的問題是鑄造一個屬性字典場(item1.Filename ITEM2的。[「文件名」])
更新
@nejcs
我試圖使用你的解決方案但不幸的是我有例外:
System.ArgumentException:Microsoft.SharePoint.Client.ListItem「型 的ParameterExpression'不能用於典型的代表 參數e'CastExpression.Picture''
屬性「Item」負責字典值,但我認爲轉換存在問題。下面是堆棧跟蹤:
在System.Linq.Expressions.Expression.ValidateLambdaArgs(類型 delegateType,表達&體,ReadOnlyCollection 1個參數)在 System.Linq.Expressions.Expression.Lambda [TDelegate](式體, 字符串名稱,布爾尾調用,IEnumerable的1個參數)在 System.Linq.Expressions.Expression 1.Update(式體, IEnumerable`1參數)在 System.Linq.Expressions.ExpressionVisitor.VisitLambda [T](式1 node)at System.Linq.Expressions.Expression 1.Acept(ExpressionVisitor visitor) 在System.Linq.Expressions.ExpressionVisitor.Visit(Expression節點)
在CastExpression.Program.Main(字串[] args)
我也知道身體表達怎麼看起來像
對於oldClassQuery:
Expression<Func<Picture, object>> oldQuery = x => x.FileName == "AS";
{X =>轉換((x.FileName == 「AS」))}
對於newClassQuery:
Expression<Func<ListItem, object>> newQuery = x => x["FileName"] == "AS";
{X =>轉換((X。get_Item(「FileName」)==「AS」))}
您的解決方案是使用'ExpressionVisitor'並手動重寫表達式樹。 –
我更新了有關您收到的例外的答案。 – nejcs