0

ユーザーがいくつかの要素とそれらの間の演算子を示すインターフェイスがあり、結果を表示する必要があります。

ユーザーは、p1 OP v1 OR p2 OP v2wherep1のようなフィルターを作成して、 etc のようp2Personプロパティを作成し、比較値 (10、'Maria'、'LA')、OP は比較演算子 (=、<、>)、OR は論理演算子 (can) です。 AND にもなります)。Age, Name, Locationv1v2

例:
Age > 18 AND Location = 'Paris'、または別のようなもの
Name Contains 'andro' AND Sex = 'm'

myPeopleコレクションとこのフィルター文字列があれば、Linq.Expressions を使用してこの式を作成して適用するにはどうすればよいですか?

DynamicLinqを使用しようとしましたが、実際には "Where" on の使用に問題がありList<Person>、明らかにそうではありませんIQueryable...

4

1 に答える 1

1

で使用しようとしている場合はList<T>、最初から式ツリーを使用する必要はありません。

public static Func<T, bool> Or<T>(Func<T, bool> predicate1,
                                  Func<T, bool> predicate2)
{
    return t => predicate1(t) || predicate2(t);
}

public static Func<T, bool> And<T>(Func<T, bool> predicate1,
                                   Func<T, bool> predicate2)
{
    return t => predicate1(t) && predicate2(t);
}

次に、次のことができます。

Func<Person, bool> isAdult = person => person.Age > 18;
Func<Person, bool> isInParis = person => person.Location == "Paris";

var personInParis = And(isAdult, isInParis);

後でそれらが必要な場合は、式ツリーに相当するものについては、 を参照してPredicateBuilderください。

トリッキーな部分は、文字列を式ツリーに変換することから始めます。

Dynamic LINQ が必要な他のすべてを実行する場合は、 を使用してからAsQueryableを作成できます。IQueryable<T>IEnumerable<T>

于 2011-08-12T12:57:01.427 に答える