天天看點

Entity Framework 支援 DataTable

轉載: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命名空間,然而方法卻無法自動提示。是以目前我是建立在頁面同級節點下的。當然這是一個不好的習慣,目前沒有找到好的解決方法。