我想構建一個通用的查詢機制來訪問我的存儲庫。我希望使用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