ADO.Net Entity Framework - 簡易資料查詢

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

 

DotBlog 的標籤:,