EntityFramework 执行SQL语句进行参数化查询代码示例

在我们用EntityFramework时,一般情况下我们是要将数据库表 或对象添加到edmx文件中,以建立数据映射模型;从而进行后续的增删查改。但有时在做老系统维护或改造时,会发现老系统代码中有很长的拼装SQL语句, 好多这个连接那个连接非常复杂(能有上千行之多啊,如在现在我们可能就用存储过程处理了,但碍于风格统一,客户限制等),这时去理清里面的关系,再将需用 到的表添加大edmx中,再按照连接关系去用linq形式查询有时觉得真的好费时间。

        其实呢,EntityFramework也是支持sql语句查询的,而且支持的也非常棒;就跟利用ADO.Net一样,写个sql语句,参数预定义好,传 进去后执行就可得到返回的结果。更值得注意的一点是,还不需要将数据表拉进edmx文件中,把要移植的sql语句直接搬过去,参数传进去就可以了,也可谓 省时省力;当然我们要根据实际需要自定义一下结果实体类。现把示例代码贴出来,时间考虑,直接贴的项目中的代码,需要的参照修改即可,不要纠结。

using (MySQLEntities opxEnity = new MySQLEntities())  
    {  
        var sqlText = "SELECT cpm.ManagerID, usr.Email FROM componentmanagers cpm INNER JOIN users usr ON usr.UserID = cpm.ManagerID INNER JOIN components cmp ON cmp.ComponentID = cpm.ComponentID WHERE usr.Deleted = 0 AND cmp.Deleted = 0 AND cmp.Closed = 0 AND cmp.IsMicros = @IsMicros ORDER BY ManagerID";  
        var args = new DbParameter[] {  
            new MySqlParameter {ParameterName = "IsMicros", Value = 1}  
        };  
        var opsManagers = opxEnity.Database.SqlQuery<OpsManagersModel>(sqlText, args).Distinct(new FastPropertyComparer<OpsManagersModel>("ManagerID")).ToList();  
        //to do ...  
    }

 结果实体类:

class OpsManagersModel  
    {  
         public string ManagerID { get; set; }  
         public string Email { get; set; }   
    }