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