我正在尝试构建一个通用查询机制来访问我的存储库。我希望使用 Lambda 表达式来过滤和排序查询。我正在努力寻找一种方法来传递一个通用 Lambda 表达式列表,特别是用于 order-by,并且希望能得到帮助。
编辑:我试图满足的两个要求是,不要将 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 函数。
我怎样才能做到这一点?