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

は、上記の例では、私は動的に商品名と製品コードを設定したいです。これらは列名です。配列や場所に格納することができます。私は配列やリストから動的に結合したいと思っていました。linqで動的に結合式を作成するには?

+0

動的列のlistProductxとlistProductx2に参加したいとおっしゃいますか? – sr28

+0

@ sr28はい...とにかくダイナミックな表現を作成しますか? – Pradu

+0

まだ問題が解決しない場合は、listProductxクラスを表示して、一致する単語を説明してください。 –

答えて

0

私が正しく理解していれば、あなたは動的に比較式を構築したいです。あなたは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をターゲットにしていると仮定すると、

2

。外側の鍵セレクタ、インナーキーセレクタと結果セレクタ -

実際Join方法3式(のfuncs)を必要とします。同じタイプの2つの列挙型を結合したいので、外側と内側のキーセレクタは同じものになります。

プロパティの数が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クラスで両方の方法を入れて)、それを使用しているヘルパーメソッドを作成することができます。

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、のFunc compareValue) {リターンlist1.Select(ITEM1 => list2.Any(ITEM2 => compareValue(ITEM1あります(検索=>検索) && list2.Select(item2 => list1.Any(item1 => compareValue(item1、item2)))すべて(検索=>検索); } ' – Pradu

+0

私はこの関数を' var JoinExp = listProduct.Join(listProduct2、new [] {"ProductName"、 "ProductCode"}); '' bool IsSuccess2 = ListComparison.CompareTwoLists(listProduct、listProduct2、(listProductx、listProductx2 )=> Convert.ToBoolean(JoinExp)) 'エラーが発生しています。 ' d__37'4タイプのオブジェクトをキャストすることができません – Pradu