天天看点

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>