是否可以使用表达式树构建复杂查询

时间:2018-03-17 16:13:16

标签: c# linq entity-framework-core

我有这个方法给我一个由演员

拍摄的过滤电影的集合
private IList<Movie> FilterByActor(IList<Actor> Actors)
{
    //from moviesToFilter from context
    return Actors != null ? moviesToFilter
        .Where(movie => Actors.All(requiredActor => 
            movie.MovieActor.Any(movieActor => movieActor.Actor == requiredActor)))
        .ToList() : null;
}

问题是Actors的期望我想通过导演,作家,流派等进行过滤。对于每个过滤器,我需要一个类似的方法来使我的代码超重。

因此,有一种方法可以构建适当的查询。

我知道Expression表用于此表,我之前构建了一些简单的查询。但是这个查询要复杂得多,我不知道如何动态构建它。

任何想法或例子?

1 个答案:

答案 0 :(得分:0)

您可以通过一个方法来完成主过滤,该方法采用描述要搜索的集合的函数(演员,导演等)。

public IList<Movie> FilterByActor(ICollection<Actor> actors) {
    return FilterBy(m => m.MovieActor, actors);
}

public IList<Movie> FilterByDirector(ICollection<Director> directors) {
    return FilterBy(m => m.MovieDirectors, directors);
}

private IList<Movie> FilterBy<T>(Func<Movie, ICollection<T>> fn, ICollection<T> required) {
    return moviesToFilter.Where(m => fn(m).Any(a => required.Contains(a))).ToList();
}