我想构建一个通用的查询机制来访问我的存储库。我希望使用Lambda表达式来筛选和排序查询。我正在努力寻找一种方法来传递通用的Lambda表达式列表,特别是为了顺序排列,并希望能够为此提供帮助。编辑:2要求我试图满足的是,不暴露超出存储库的IQueryable,但仍然能够在数据库级别进行一些过滤和排序。OrderBy Lambda的泛型列表
为了更好地说明这一点让我告诉你的代码
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>();
}
这是非常好的,但表达< 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函数。
我该怎么做?
.NET已经提供订购和排序,以扩展方法,如'.OrderBy'和'机制。在哪里和一个更干净的语法。为什么不公开像'repository.Get(Func,IEnumerable queryExpression)''? (或者如果你需要解析表达式树,使它成为'Expression
Jay
2012-08-16 01:31:12
我不太喜欢对不起,可以举一个具体的例子吗? – 2012-08-16 01:48:14
你可以使用'object'作为你的类型吗? – Gabe 2012-08-16 01:49:26