转载:http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html

https://www.cnblogs.com/hanjun0612/p/9779896.html

datatable 在有的时候是非常有用的 例如 做报表等  因为我们不可能为每个报表建一个 实体类 这样比较麻烦

这个时候返回datatable  则比较有用

(这也是Entity Framework跨库的一种解决方案,虽然无法直接获取实体对象。不过对于webapi来说,直接返回datatable给访问者,会自动转换为json。所以如果你使用webapi时,遇见Entity Framework跨库,也可以采用这种方式)

写一个扩展方法

复制代码
复制代码
   /// <summary>
       /// EF SQL 语句返回 dataTable
       /// </summary>
       /// <param name="db"></param>
       /// <param name="sql"></param>
       /// <param name="parameters"></param>
       /// <returns></returns>
       public static DataTable QueryTable_Extend(this Database db,
                string sql,
                SqlParameter[] parameters=null)
        {

            SqlConnection conn = new System.Data.SqlClient.SqlConnection();
            try
            {
                conn.ConnectionString = db.Connection.ConnectionString;
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = sql;


                if (parameters != null && parameters.Length > 0)
                {
                    foreach (var item in parameters)
                    {
                        cmd.Parameters.Add(item);
                    }
                }




                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
            finally
            {
                conn.Close();
            }
        }
复制代码
复制代码

 

调用如下

复制代码
复制代码
   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = GetDataTable();
            GridView1.DataBind();
        }
    }


    public DataTable GetDataTable()
    {
        GardenHotelContext context = new GardenHotelContext();
        int LanType = 0;
        int state = 0;
        SqlParameter[] sqlparams=new SqlParameter[2];
        sqlparams[0]=new SqlParameter("LanType",LanType);
        sqlparams[1]=new SqlParameter("state",state);

//这里有个问题,在使用时传递进来的 db.Connection有时为空。
//(具体原因还没找到。调试过,db的确有值,但是调用次方法时,就会显示没值,导致数据库登陆失败)
//所以需要给db.Connection重新赋值一下
db.Connection.ConnectionString = WebConfigurationManager.ConnectionStrings["POEntities"].ToString();
DataTable DataTable = context.Database.SqlQueryForDataTatable("select LeaveName,LeaveEmail from LeaveInfo where LanType=@LanType and State=@State", sqlparams); return DataTable; }
复制代码
复制代码
 

 

 

这里顺便提一下:由于扩展方法,每次需要using命名空间,然而方法却无法自动提示。所以目前我是创建在页面同级节点下的。当然这是一个不好的习惯,目前没有找到好的解决方法。
posted on 2019-01-10 10:21  无爱无伤  阅读(292)  评论(0编辑  收藏  举报