gpt4 book ai didi

c# - OrderBy Lambda 的通用列表

转载 作者:行者123 更新时间:2023-11-30 17:10:37 25 4
gpt4 key购买 nike

我正在尝试构建一个通用查询机制来访问我的存储库。我希望使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com