1

次のようにLINQクエリを使用して検索する必要があるさまざまなプロパティ(タイトル、リリース年、評価など)を持つ映画のコレクションがあります。

public BindingList<Movie> SearchByTitle(string title)
{
    var matches = from movies in movieCollection
                  where movies.Title == title
                  select movies;
    // do some other stuff with the matches
}

whereただし、検索間で変更されるのはセクションだけなので、各プロパティを個別に検索する方法は必要ありません。たとえば、where movies.Rating == ratingまたはwhere movies.ReleaseYear == releaseYear。ある種の、ExpressionまたはセクションFuncとして渡すことにより、検索メソッドをすべての異なる種類の検索で再利用できるようにするにはどうすればよいですか?where

4

3 に答える 3

5

whereセクションとしてある種のExpressionまたはFuncを渡すことにより、検索メソッドをすべての異なる種類の検索で再利用できるようにするにはどうすればよいですか?

クエリは実際にはwhere句以外のものではありませんただし、クエリ式を使用せずに、where部分を簡単に構成できます。

public BindingList<Movie> SearchByTitle(Expression<Func<Movie, bool>> predicate)
{
    var matches = movies.Where(predicate);

    // Do common stuff with the matches.
}

編集:あなたが話していたことを考えると、私はそれmoviesがであると仮定していました。それがただの場合、あなたは欲しいです:IQueryable<T>ExpressionIEnumerable<T>

public BindingList<Movie> SearchByTitle(Func<Movie, bool> predicate)
{
    var matches = movies.Where(predicate);

    // Do common stuff with the matches.
}
于 2012-11-03T19:31:52.443 に答える
1

拡張メソッドを使用できます(これを静的クラスで定義します)

    public static IQueryable<T> AddSearchParameter<T>(this IQueryable<T> query, bool condition, System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        if (condition)
        {
            query = query.Where(predicate);
        }

        return query;
    }

したがって、たとえば:

public BindingList<Movie> Search(string title, int? year, int? rating)
{
    var matches = movieCollection.AddSearchParameter(!string.IsNullorEmpty(title), m=>m.Title == title);
    matches = matches.AddSearchParameter(year.HasValue, m=>m.Year == year.Value);
    matches = matches.AddSearchParameter(rating.HasValue, m=>m.rating >= rating.Value);

    // do some other stuff with the matches
}

これをデータベースに対して使用している場合、列挙するまで実際にはクエリが実行されないため、データベースに対して複数の呼び出しが行われることはありません。

于 2012-11-03T19:38:21.387 に答える
0

CompiledQueryを使用できます。

SOでこの非常に興味深い答えを確認してください。

それが役に立てば幸い。

于 2012-11-03T19:32:32.110 に答える