吵吵   2014-05-07  阅读:6,425

使用Entity Framework来做数据库的查询和相关操作带来的好处是不不言而喻的,吵吵最近用的也很是欢快。但是在做LIS系统的一些接口的时候,也会出现一些问题。比如直接通过data first方式从数据库生成实体类的过程中,没有主键的那些表,EF是没有办法帮你生成对应的实体类的。

虽然想吐槽一下连主键都没有的数据库到底设计的有多烂,但是吵吵不是吐槽星人,能量集中了那么多也毁灭不了地球。这逼得我不得不去想怎么用Entity Framework直接来执行SQL语句。


在EF4.0版本以上,就已经提供了两个函数:

首先是执行select即查询SQL的函数:

//
// 摘要:
// 对数据源直接执行查询,此查询将返回类型化结果的序列。
//
// 参数:
// commandText:
// 要用数据源的本机语言执行的命令。
//
// parameters:
// 要传递给命令的参数数组。
//
// 类型参数:
// TElement:
//
// 返回结果:
// 类型为 TResult 的对象的枚举。
[TargetedPatchingOptOut(“Performance critical to inline this type of method across NGen image boundaries”)]
public ObjectResult ExecuteStoreQuery(string commandText, params object[] parameters);

但是这个函数并不是那么好用的,你可以看到它除了需要SQL语句外,还需要传入TElement,换言之,你除了要构造SQL语句外,还需要告诉它返回的序列集到底是个什么东西,它才会在执行完SQL后将结果正确返回给你。

如果是简单的一个或者多个值,你可以用string 或者 array来代替,例如:

string sql = "select KMDLISCode from KMDict where KMDCode=" + "'" + AStr + "'";

            var select = db.ExecuteStoreQuery<string>(sql).ToList();
            
            if (select.Count == 0)
            {
                return "";
            }
            else
            {
                //KMDict KD = select.Last();
                
                return select.First();
            }

由于有个表没有主键,EF没有生成相应的类,因此我就手打了一个类,使用ExecuteStoreQuery能够返回该类的结果,但是发现所有的结果都是空的,但是select.Count却显示有三条记录。这件事情让人很困惑。直到我发现了我手写的模型类是没有加{ get; set; } 的时候,我才恍然大悟!

还有一个函数是执行update insert delete等相关语句的:

//
// 摘要:
// 利用现有连接对数据源直接执行任意命令。
//
// 参数:
// commandText:
// 要用数据源的本机语言执行的命令。
//
// parameters:
// 要传递给命令的参数数组。
//
// 返回结果:
// 受影响的行数。
public int ExecuteStoreCommand(string commandText, params object[] parameters);
//
// 摘要:
// 对数据源直接执行查询,此查询将返回类型化结果的序列。
//
// 参数:
// commandText:
// 要用数据源的本机语言执行的命令。
//
// parameters:
// 要传递给命令的参数数组。
//
// 类型参数:
// TElement:
//
// 返回结果:
// 类型为 TResult 的对象的枚举。

这个函数没啥可说的,直接用就好了,返回的是int,即产生影响的记录数。

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

一条回应:“Entity Framework如何直接执行SQL语句”

  1. 企业文化标语[http://www.isofactory.com.cn/]说道:

    付出总会有回报的

发表评论

电子邮件地址不会被公开。 必填项已用*标注