ADO.Net Entity Framework - 簡易資料存取
在Entity Framwork中,提供了幾種查詢Entity的方式:LINQ To Entity Or EntityClient或是ObjectContext。
1.LINQ To Entity
using (MSPetShop4Entities msShopEntity = new MSPetShop4Entities())
{
var categorys = msShopEntity.Category.Where(p => p.CategoryId == "BUGS");
GridView1.DataSource = categorys;
GridView1.DataBind();
}
其實使用起來和LINQ To SQL沒有什麼差異,只是把Entities當做DataContext而已。
2. 使用EntityClient(using System.Data.EntityClient)
using (EntityConnection ec = new EntityConnection(ConfigurationManager.ConnectionStrings["MSPetShop4Entities"].ConnectionString))
{
ec.Open();
string eSql = "SELECT C.CategoryId, C.Name, C.Descn FROM MSPetShop4Entities.Category AS C WHERE C.CategoryId = @categoryid";
EntityCommand ecm = new EntityCommand(eSql, ec);
ecm.CommandType = System.Data.CommandType.Text;
EntityParameter ep = new EntityParameter("categoryid", DbType.String);
ep.Value = "BUGS";
ecm.Parameters.Add(ep);
EntityDataReader edr = ecm.ExecuteReader(CommandBehavior.SequentialAccess);
//DataTable dt = new DataTable();
//dt.Load(ecm.ExecuteReader(CommandBehavior.SequentialAccess));
GridView1.DataSource = edr;
GridView1.DataBind();
ec.Close();
}
使用的方式和以前的ADO.NET蠻像的,不過Entity SQL的使用方式和T-SQL不太一樣,需要特別注意,ex:需要宣告別名來存取。另外,雖然EntityDataReader繼承自DbDataReader,但是他並不支援GetSchmaTable()方法;還有,參數宣告時,必需省略「@」。
還有一點,雖然ExecuteReader有不需要宣告參數的簽名,可是他還是會要求你要帶入CommandBehavior.SequentialAccess。(不懂到底是為啥?)
3.使用ObjectContext (using System.Data.Objects)
方法一:
using (MSPetShop4Entities msShopEntity = new MSPetShop4Entities())
{
string eSql = "SELECT VALUE C FROM Category AS C WHERE C.CategoryId = @categoryid";
//ObjectQuery<Category> query = msShopEntity.CreateQuery<Category>(eSql);
ObjectQuery<Category> query = msShopEntity.CreateQuery<Category>(eSql, new ObjectParameter("categoryid", "BUGS"));
GridView1.DataSource = query;
GridView1.DataBind();
}
方法二:
using (MSPetShop4Entities msShopEntity = new MSPetShop4Entities())
{
ObjectQuery<Category> query = msShopEntity.Category.Where("it.CategoryId = @categoryid", new ObjectParameter("categoryid", "BUGS"));
GridView1.DataSource = query;
GridView1.DataBind();
}
看起來跟LINQ有點像,不過他的查詢是使用Entity SQL,所以在方法二的時候,也必須使用別名。比較特別的是,因為查詢回來的物件已經指定為Entity,所以在SQL句的部份,必需使用「Value」來取回。還有一個比較特別的地方,在ObjectQuery建立的時候,簽名的部份我只有看到:
public ObjectQuery<T> CreateQuery<T>(
string queryString,
params ObjectParameter[] parameters
)
但params是可以省略不帶的。
用了幾種方法,我還是覺得LINQ比較好用,Entity SQL使用上真的有幾個頗怪的地方,不過也有可能是因為我才初學所以還不懂,希望能有其它人一起來分享一下:D