如何将IQueryable <T>转换为Expression <Func <T,bool >>?

Mis*_*sky 9 c# linq expression

我只是想构建一个动态过滤器.最后回归

 Expression<Func<Event, bool>>
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用Combine(AndAlso)表达式,但它不起作用,最后我发现有IQueryable查询效果很好,但现在我怎样才能将它转换为返回类型 -

Expression<Func<Event, bool>>?
Run Code Online (Sandbox Code Playgroud)

我的代码:

    public IQueryable<Event> GetBySearch(EventFilter search)
    {
        IQueryable<Event> query = this.Context.Events.AsQueryable();
        Expression<Func<Event, bool>> expression = null;

        if (search.CategoryId != 0)
        {
            query = query.Where(x => x.CategoryId == search.CategoryId);
        }

        if (search.SubCategoryId != 0)
        {
            query = query.Where(x => x.SubCategoryId == search.SubCategoryId);
        }

        expression = query.Expression as Expression<Func<Event, bool>>; //This convert is not working, it returns null.

        return this.Context.Events.Where(expression);
    }
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 7

任何原因你不只是做以下事情:

public IQueryable<Event> GetBySearch(EventFilter search)
{
    IQueryable<Event> query = this.Context.Events.AsQueryable();

    if (search.CategoryId != 0)
    {
        query = query.Where(x => x.CategoryId == search.CategoryId);
    }

    if (search.SubCategoryId != 0)
    {
        query = query.Where(x => x.SubCategoryId == search.SubCategoryId);
    }

    return query;
}
Run Code Online (Sandbox Code Playgroud)

正如弗洛里安在评论中所说,应该避免返回IQueryables(如果可能的话).简单的解决方案是返回一个列表:

public List<Event> GetBySearch(EventFilter search)
{
    IQueryable<Event> query = this.Context.Events.AsQueryable();

    if (search.CategoryId != 0)
    {
        query = query.Where(x => x.CategoryId == search.CategoryId);
    }

    if (search.SubCategoryId != 0)
    {
        query = query.Where(x => x.SubCategoryId == search.SubCategoryId);
    }

    return query.ToList();
}
Run Code Online (Sandbox Code Playgroud)