(listProductx, listProductx2) => listProductx.ProductName == listProductx2.ProductName && listProductx.ProductCode == listProductx2.ProductCode
在上面的例子中,我想動態設置ProductName和ProductCode。這些是列名;我們可以將其存儲在數組或任何地方。我想從數組或列表中動態加入它。如何在linq中動態創建連接表達式?
(listProductx, listProductx2) => listProductx.ProductName == listProductx2.ProductName && listProductx.ProductCode == listProductx2.ProductCode
在上面的例子中,我想動態設置ProductName和ProductCode。這些是列名;我們可以將其存儲在數組或任何地方。我想從數組或列表中動態加入它。如何在linq中動態創建連接表達式?
如果我理解正確,您想要動態構建比較表達式。您可以根據https://msdn.microsoft.com/en-us/library/mt654267.aspx和SO問題How do I dynamically create an Expression<Func<MyClass, bool>> predicate from Expression<Func<MyClass, string>>?的文檔來完成此操作。一般的方法是一樣的,你只需要以不同的方式構建表達式樹。
假設您將LINQ定位到對象。
其實Join
方法需要3個表達式(funcs) - 外鍵選擇器,內鍵選擇器和結果選擇器。既然你想加入兩個相同類型的枚舉類型,外部和內部的鍵選擇器將會是一樣的。
如果屬性數不超過7,我們可以使用Tuple<>
作爲關鍵字。下面是我們如何動態構造選擇:
static Func<T, object> CreateSelector<T>(IEnumerable<string> propertyNames)
{
var sourceType = typeof(T);
var parameter = Expression.Parameter(sourceType, "e");
var properties = propertyNames.Select(name => Expression.PropertyOrField(parameter, name)).ToArray();
var selector = Expression.Lambda<Func<T, object>>(
Expression.Call(typeof(Tuple), "Create", properties.Select(p => p.Type).ToArray(), properties),
parameter);
return selector.Compile();
}
然後,我們可以創建一個使用它(把一些頂級的公共靜態類你所選擇的這兩種方法),一個輔助方法:
public static IEnumerable<Tuple<T, T>> Join<T>(this IEnumerable<T> left, IEnumerable<T> right, IEnumerable<string> propertyNames)
{
var keySelector = CreateSelector<T>(propertyNames);
return left.Join(right, keySelector, keySelector, Tuple.Create);
}
現在你可以使用像這樣的東西:
class Product
{
public string ProductName { get; set; }
public string ProductCode { get; set; }
}
List<Product> list1 = ...;
List<Product> list2 = ...;
var result = list1.Join(list2, new [] { "ProductName", "ProductCode" });
我可以使用上面的'result'作爲'Func
我的功能是'公共靜態布爾CompareTwoLists
我調用這個函數'var JoinExp = listProduct.Join )=> Convert.ToBoolean(JoinExp))'但是出現錯誤。無法投射'
你是說你想加入listProductx和listProductx2動態列嗎? – sr28
@ sr28是...有無論如何創造動態表達? – Pradu
如果您仍然遇到問題,請顯示listProductx類並用文字解釋您想要匹配的內容。 –