c# - OrderBy Lambda 的通用列表

标签 c# entity-framework lambda

我正在尝试构建一个通用查询机制来访问我的存储库。我希望使用 Lambda 表达式来过滤和排序查询。我正在努力寻找一种方法来传递通用 Lambda 表达式的列表,特别是对于排序依据,并且非常感谢这样做的帮助。

编辑:我试图满足的 2 个要求是,不在存储库之外公开 IQueryable,但仍然能够在数据库级别执行一些过滤和排序。

为了更好地说明这一点,让我向您展示代码

public class Query<T>
{
    public class OrderBy<T>
    {
        public Expression<Func<T, **int**>> Clause { set; get; } // Order By clause
        public bool Descending = true;
    }

    public Expression<Func<T, bool>> Where { set; get; } // Where clause
    public IList<OrderBy<T>> OrderBys { set; get; } // Where clause

    public Query()
    {
        OrderBys = new List<OrderBy<T>>();
    }
}    

public IEnumerable<Person> FindBy(Query<Person> query)
{
    IQueryable<Person> Temp = GetObjectSet();
    if (query.Where != null) 
        Temp = Temp.Where(query.Where);
    foreach (var OrderByThis in query.OrderBys)
    {
        if (OrderByThis.Descending) 
            Temp = Temp.OrderByDescending(OrderByThis.Clause);
        else 
            Temp = Temp.OrderBy(OrderByThis.Clause);
    }

    return Temp.ToList<Person>();
}

这一切都很好,但是 Expression< Func< T, int>> 不是通用的。我需要能够执行以下操作:

Query<Person> query = new Query<Person>();
Query<Person>.OrderBy<Person> clause1 = new Query<Person>.OrderBy<Person>();
clause1.Clause = m => m.Username;
Query<Person>.OrderBy<Person> clause2 = new Query<Person>.OrderBy<Person>();
clause2.Clause = m => m.DateOfBirth;
query.OrderBys.Add(clause1);
query.OrderBys.Add(clause2);

即添加许多不同类型的不同字段。

我想一定有一种方法可以将它们存储为通用 Lambda 函数,然后在存储库中将其转换为它需要的强类型 Lambda 函数。

我该怎么做?

最佳答案

正如我在对 your other question 的回答中指出的那样,我一般不鼓励这种方法。公开 IQueryable<T> 更有意义/IOrderedQueryable<T> .

也就是说,在对 How to pass multiple Expressions to OrderBy for EF? 的选定答案中有一个符合您意图的解决方案。 .

它允许您使用如下语法:

var query = context.Users ... ;

var queryWithOrderBy = ApplyOrderBy(query,
    new OrderByExpression<User, string>(expression: u => u.UserName, descending: false),    // a string, asc
    new OrderByExpression<User, int>(expression: u => u.UserId, descending: true));  // an int, desc

var result = queryWithOrderBy.ToList(); // didn't throw an exception for me

关于c# - OrderBy Lambda 的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11979140/

相关文章:

c# - 如何确定远程驱动器是否有足够的空间来使用 C# 写入文件?

c# - Task.ContinueWith 在非异步方法中的性能与使用 async/await 的对比

c++ - C++ 中的 Lambda 表达式与仿函数

c# - 正则表达式可以在正向查找后进行多次匹配(自动换行后)吗?

c# - 创建动态 Linq 到 EF 表达式以选择 IQueryable 到新类中并分配属性

c# - 在具有多个上下文的 Entity Framework 上使用异步保存更改

c# - 从 EF 查询获取 Id,然后使用它来删除记录

c++ - 多次调用 lambda 表达式

java - 确保函数参数可序列化的最佳方法是什么?

c# - OOP设计问题: responsibility in containee or container?