2016-09-05 11 views
0

私はさまざまな例と質問を見てきましたが、このクエリをうまく書く方法を理解できません。 where句の条件はfilter.conditionにありますC#DataTableのwhere句を変数として使用するLinqクエリの使用

private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup) 
    { 

     Func<int, string> whereClause = test => filter.Condition; 

     IEnumerable<object> query = 
     from rows in datatableLookup.AsEnumerable().Where(whereClause) 
     select rows.Field<object>(lookupValueField); 
     return query.ToArray(); 

    } 

このエラーが発生しています。私はさまざまなことを試みましたが、残念ながらそれを解決する方法を理解できません。

MultipleKeyConditionBuilder.This機能は、フィルタ条件を与える

に 'System.func(int型、文字列)' 'System.func(system.Data.DataRow、int型、ブール値)' から変換することはできません 。それはとして定義されます。

public MultipleKeyConditionBuilder(List<string> sourceKeyFieldsList, List<string> referenceKeyFieldsList, DataRow sourceRow) {} 

filter.Conditionは、例えば、文字列を与える "PROJECT_ID = 255454"

+0

あなたの質問を編集し、 'MultipleKeyConditionBuilder'に軽く投げてください –

+0

複数の条件がありますか?フィルタの値は何ですか。複数のフィルタの場合の条件? –

+0

はい、1つ以上の条件があります。状況に応じて'条件+ = referenceKeyFieldsList [i] .ToValidSQLName()+ "=" + filterChar + sourceRow [sourceKeyFieldsList [i]] + filterChar; ' –

答えて

1

あなたはこの

Func<DataRow, bool> whereClause = test => filter.Condition; 

のような宣言を使用することができます私はfilter.Conditionはブール値を返すことを想定しています。

Func<DataRow, bool> whereClause = test => true; 

更新

filter.Conditionproperty = 'value'のような文を使用して文字列を返す私はこの単純化をテストしています。これは、このステートメントを取り、いくつかの機能で評価する必要があり、現在のDataRowから値を挿入し、

... 
    Func<DataRow, bool> whereClause = row => SomeClass.Evaluate(filter.Condition, row); 
    ... 

public static class SomeClass 
{ 
    public static bool Evaluate(string expression, DataRow data) 
    { 
      ... do some sophisticated stuff ... 
      return true/false; 
    } 
} 

しかし、このソリューションは唯一の問題への直接的な答えを与えるためにフィッティングされたように、ブール値を返します。

MultipleKeyConditionBuilderMultipleKeyConditionBuilder.Conditionに変更して、stringではなく、Predicate<DataRow>を返すことをお勧めします。その後、あなたは書くことができます

Func<DataRow, bool> whereClause = test => filter.Condition(test); 
+0

filter.Conditionは文字列を返します –

+0

今最後の部分だけが異なります。それをboolに変更する方法、または他の文字列に変更する方法は? –

+0

MultipleKeyConditionBuilderはどのように定義されていますか? –

0

私はあなたがなぜそこに複雑なことを知っていません。

これは仕事をするはずです。

+0

datatableLookup.Selectは遅いです。私はパフォーマンスを改善したい。だから私はLinqを使用しています。私もデータビューを試してみましたが、それは有益ではありませんでした。 –

+0

@Masood質問を編集し、 'MultipleKeyConditionBuilder'にいくつかの光を投げてください。どのようにフィルターを準備していますか? –

+0

この関数は、条件を作成するために条件変数に文字列を追加しています。データテーブルの選択ステートメントには最適ですが、linqは機能しません –

0
private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup) 
{ 
    DataRow[] rows = datatableLookup.Select(filter.Condition); 
    return rows.Select(r => r.Field<object>(lookupValueField)).ToArray(); 
} 

System.Linq.Enumerable.Whereはfilter.Conditionは、C#コードであるべきで動作するように行のためwhereClause = test => filter.Condition;を意味Func<T, bool>(入力としてTを取り、ブール値を返す、すなわち機能) を期待します。あなたの場合、それは文字列のようです。

あなたがここでやろうとしていることを理解していれば、filter.ConditionにはExpression<Func<DataRow, bool>>が返されます。

以下は、表現の仕組みを理解するのに役立つコードスニペットです。

 Expression<Func<string, bool>> conditionExpression = x => "MyString".Equals(x); 

     // Following if block will not compile 
     //if (conditionExpression("MyString")) 
     // Console.WriteLine("True"); 
     //else 
     // Console.WriteLine("False"); 

     var condition = conditionExpression.Compile(); 

     // Following if block will compile. 
     if(condition("MyString")) //this compiles. 
      Console.WriteLine("True"); 
     else 
      Console.WriteLine("False"); 

これが役に立ちます。

関連する問題