2016-09-08 88 views
-1
(listProductx, listProductx2) => listProductx.ProductName == listProductx2.ProductName && listProductx.ProductCode == listProductx2.ProductCode 

在上面的例子中,我想動態設置ProductName和ProductCode。這些是列名;我們可以將其存儲在數組或任何地方。我想從數組或列表中動態加入它。如何在linq中動態創建連接表達式?

+0

你是說你想加入listProductx和listProductx2動態列嗎? – sr28

+0

@ sr28是...有無論如何創造動態表達? – Pradu

+0

如果您仍然遇到問題,請顯示listProductx類並用文字解釋您想要匹配的內容。 –

回答

2

假設您將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" }); 
+0

我可以使用上面的'result'作爲'Func compareValue'的參數嗎? – Pradu

+0

我的功能是'公共靜態布爾CompareTwoLists (IEnumerable的 list1的,IEnumerable的 list2中,函數功能選擇compareValue) { 返回list1.Select(ITEM1 => list2.Any(ITEM2 =>選擇compareValue(ITEM1 ,item2)))。All(search => search) && list2.Select(item2 => list1.Any(item1 => compareValue(item1,item2)))。 (listProduct2,new [] {「ProductName」,「ProductCode」});''bool IsSuccess2 = ListComparison.CompareTwoLists(listProduct,listProduct2,(listProductx,listProductx2){ }' – Pradu

+0

我調用這個函數'var JoinExp = listProduct.Join )=> Convert.ToBoolean(JoinExp))'但是出現錯誤。無法投射'類型的對象d__37'4 – Pradu