天天看點

Entity Framework 實體架構的形成之旅--界面操作的幾個典型的處理(8)

對于業務對象的增加,由于我們引入了DTO對象,是以在界面的處理端,肯定也是利用了DTO對象進行的,如下代碼是增加、修改的處理操作處理。

上面的操作,和我之前的混合架構的使用代碼是差不多的,原來的基于EnterpriseLibrary架構的架構,實體類采用的就是 "表名+Info" 的方式,雖然這裡的**Info代表DTO對象,是實體架構的Entity對象的映射類,不過總體業務上的處理代碼是差不多的了,這也是我希望看到比較平滑過渡和容易了解的改變之一。

如果對于查詢,我們知道,如果使用字元串的條件表達式,一般也是可以實作處理操作的,不過就是需要寫死SQL語句,對于一些安全性高一點的處理,可能不太好,由于實體架構可以采用Lamda表達式來進行查詢,那麼我們是否也可以在界面采用Lamda表達式來替代條件的SQL語句呢?

我們知道,上篇随筆已經介紹了引入DTO對象,用來解耦實體架構的對象模型,如下所示的子產品分層場景。

Entity Framework 實體架構的形成之旅--界面操作的幾個典型的處理(8)

這樣我們在設計BLL業務邏輯層的時候,肯定還是可以使用實體架構的Expression<Func<T, bool>>表達式的,如IBLL層的接口定義對于Expression表達式的使用接口如下所示。

不過在門面層Facade層就不能繼續使用了這種Expression<Func<T, bool>>表達式的了,同時也不能在Facade層使用IQueryable<T>接口,因為WCF服務無法序列化這個接口的。

那基于這個原因,我們應該如何傳遞Expression<Func<T, bool>> match這個條件參數的表達式呢,答案是引入Serialize.Linq元件,使用ExpressionNode對象進行承載,最後再把它解析為Expression<Func<T, bool>> match進行處理就可以了。

我們在用戶端界面裡面處理的話,就需要建構一個ExpressionNode對象,查詢處理代碼如下所示。

這裡主要需要先從Expression<Function<T,boo>>到ExpressionNode,通過調用expression.ToExpressionNode();進行處理得到,如下代碼所示。

我們在Facade接口實作端,就需要把ExpressionNode反過來變成Expression<Function<T,boo>>對象。

這樣我們就可以很好利用Entity Framework 實體架構的LINQ表達式進行查詢了。

上面的查詢代碼裡面,我們注意到了,條件裡面隻有一個條件,如下代碼。

那麼對于有多個條件的話,處理就需要特殊處理了,否則就沒法組合多個條件進行查詢了,多個條件的處理是如何的呢?

如對于日志查詢界面來說,如果是采用條件語句的方式,需要使用下面的代碼組裝語句,然後通過接口方法進行擷取資料。

這裡有很多條件,通過 SearchCondition 對象,我們能夠很友善組合多個條件的查詢,然後生成所需的條件語句就可以了,那麼對于實體架構裡面,我們需要采用Lamda表達式的話,應該如何建構對象并傳入給接口方法呢,代碼如下所示。

這裡我們注意到expression.And或者expression.Or函數,它不是這個expression對象的方法的,是我們針對這個做的一個擴充類函數,它專門處理 Lamda-Expression表達式的擴充,友善組合多個條件,如兩個表達式條件可以組合為AND或者OR條件方式。

Entity Framework 實體架構的形成之旅--界面操作的幾個典型的處理(8)

這樣我們在界面處理的時候,綁定資料的處理方法就可以如下所示了。

以上就是我對于混合型的Entity Framework 實體架構的界面操作,總結的幾種分析場景,希望對大家了解在WCF模式裡面,使用實體架構的方法有所幫助。

這個系列文章如下所示:

<a href="http://www.cnblogs.com/wuhuacong/p/4336248.html">Entity Framework 實體架構的形成之旅--基于泛型的倉儲模式的實體架構(1)</a>

<a href="http://www.cnblogs.com/wuhuacong/p/4338564.html">Entity Framework 實體架構的形成之旅--基類接口的統一和異步操作的實作(3)</a>

<a href="http://www.cnblogs.com/wuhuacong/p/4338982.html">Entity Framework 實體架構的形成之旅--實體資料模型 (EDM)的處理(4)</a>

<a href="http://www.cnblogs.com/wuhuacong/p/4372674.html">Entity Framework 實體架構的形成之旅--Code First模式中使用 Fluent API 配置(6)</a>

<a href="http://www.cnblogs.com/wuhuacong/p/4449059.html">Entity Framework 實體架構的形成之旅--資料傳輸模型DTO和實體模型Entity的分離與聯合</a>

<a href="http://www.cnblogs.com/wuhuacong/p/4513376.html">Entity Framework 實體架構的形成之旅--界面操作的幾個典型的處理(8)</a>