[英]Passing a user generated query down an n-tiered application
在我的應用程序中,我使用數據訪問層(DAL)生成計划舊CLR對象(POCO),該對象將被發送到我的業務層(BL)。 然后,BL使用模型視圖ViewModel(MVVM)模式創建對象以綁定到我的表示層(PL)。
我想讓我的用戶能夠在列級別過濾數據。 例如http://demos.telerik.com/aspnet-ajax/grid/examples/generalfeatures/filtering/defaultcs.aspx
還有其他執行類似功能的網格控件,但總的來說,這就是我要提供的用戶體驗。
我有一個很大的數據集,所以我想在服務器端進行所有的分頁/排序/過濾。
將分頁/排序數據沿n層體系結構發送到我的DAL是微不足道的,因此我只提取我感興趣的記錄。
但是,我不確定如何將篩選器數據發送到我的DAL,因為用戶可以生成任意長的篩選器表達式。
我的問題是: 通過n累累的應用程序發送用戶生成的過濾器表達式的方法是什么?
我的想法:
只是一個意見,但我會不惜一切代價避免進行解析。 我也會盡可能鼓勵使用強類型數據。
我本人會接受“表達式樹”的想法。 我已經在大型應用程序中使用了它,沒有太大的問題。 由於我們使用的是.Net 2.0,因此我們構建了自己的實現來表示表達式,並且不需要太多的支持(僅用於平等)。 我無法從您的帖子中得知您是否考慮自己構建,但我們提出了以下內容:
class ValueTriple {
System.Type FieldType;
string Field;
object Value;
}
class AndCritieria {
ValueTriple[] Criteria;
}
class OrCriteria {
AndCriteria[] Criteria;
}
我們用特定於實體的豐富類型“查詢”類包裝了這些類,並最終通過排序/分頁信息擴展了OrCriteria。 上面的查詢結構使我們能夠通過本質上標准化輸入查詢結構來表達任何基於等式的條件,而無需考慮復雜性。 例如:
WHERE x = '1' AND (y = '2' OR z = '3')
也可以表示為:
WHERE (x = '1' AND y = '2') OR (x = '1' AND z = '3')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.