2010年7月7日 星期三

ADO.NET Entity 與 LINQ to SQL 比較表


ADO.NET DataEntity

LINQ to SQL

using

System.Data.Objects

System.Linq

副檔名

.edmx

.dbml

Class宣告

System.Data.Objects.ObjectContext

System.Data.Linq.DataContext

建構式

Entity() // Entityclass

DataCont() //DataContclass

Entity(string connectionString)

DataCont(string connectionString)

Entity(EntityConnection connection)

DataCont(IDbConnection connection)


DataCont(string connection, Mapping.MappingSource mappingSource)


DataCont(IDbConnection connection, Mapping.MappingSource mappingSource)

TableClass/View

Objects.ObjectQuery

Linq.Table

新增

Table

EntitySet

EntityRef

表格名稱 變數=new 表格名稱();

<指定各欄位值>

Entity.AddTo表格名稱(變數);

Entity.SaveChanges();

或者

表格名稱 變數=表格名稱.Create表格名稱(各欄位參數);

Entity.AddTo表格名稱(變數);

Entity.SaveChanges();

表格名稱 變數= new表格名稱();

<指定各欄位值>

Linq.Table table變數.InsertOnSubmit(變數);

DataCont.SubmitChanges();

表格名稱.欄名=;

Entity.SaveChanges();

先將查詢結果轉給變數 ,再重新指定欄位值後,逕行呼叫

DataCont.SubmitChanges();

或者

DataCont.ExecuteCommand("sql 命令");   //不會傳回物件

Entity.DeleteObject(ObjectEntity);

Entity.SaveChanges();

DeleteOnSubmit(o);
DataCont.SubmitChanges();

關聯

一對多

表格名稱.關聯表格名稱;

或由

變數=Entity.表格名稱.Where().ObjectEntity之函數;

// ObjectEntity之函數 有:

// First, Last, ElementAt……

變數.關聯表格.Load();

即可對 變數.關聯表格 進行操作

({master}對多{client})

EntitySet<TableEntity> client = master.client;

跟操作單一Entity相同,更可由 client.master.column 直接操作master

直接利用「TableEntity.TableEntity

關聯

多對一

變數.關聯表格Reference.Load();

即可對 變數.關聯表格 進行操作

({client}對一{master})

直接利用「TableEntity.TableEntity.column;

查詢比較

LoginUserEntities EDMabcd = new LoginUserEntities();

var p2 = from q2 in EDMabcd.aspnet_Applications

select q2;

foreach (var t in p2)

{

t.ApplicationId.ToString(); t.ApplicationName.ToString();

}

ObjectQuery myTable =
EDMabcd.aspnet_Applications;

myTable.First(p3 => p3.ApplicationName ==
"UserLogin").ApplicationId.ToString();

DataContext LINGabcd = new DataContext();

var p = from q in LINGabcd.aspnet_Applications

select q;

foreach (var t in p)

{

t.ApplicationId.ToString();

t.ApplicationName.ToString();

}

Table<aspnet_Applications> myLTable =
LINGabcd.aspnet_Applications;

myLTable.First(p3 => p3.ApplicationName ==
"UserLogin").ApplicationId.ToString();

LINGabcd.aspnet_Applications.First(p3 => p3.ApplicationName
== "UserLogin").ApplicationId.ToString();

ExecuteQuery查詢

4.0以後才提供:

Entity.ExecuteStoreQuery<string>("SELECT name
FROM CoursesSet"))

Entity.ExecuteStoreQuery<string>(“SELECT name FROM
CoursesSet WHERE CourseID =
@p0”, new SqlParameter(“@p0”, 1234))

Entity.ExecuteStoreCommand("INSERT INTO CoursesSet
(CourseID, Name) VALUES (@p0, @p1)",

"C4", "Database Concepts");

IEnumerable results = DataCont.ExecuteQuery        
        (@"SELECT c1.custid as CustomerID,         
               c2.custName as ContactName
        FROM customer1 as c1, customer2 as c2
        WHERE c1.custid = c2.custid"

);

StoredProcedure

1.必須先定義接收之實體型別(或引用資料表實體型別)

2.必須進行 Function Import (操作見下頁)

3.進行「實體」與「程序」對應

註:

如果不傳回值或傳回值為純量者,EF不支援,建議可於程式中採用

SqlCommand cmd = new SqlCommand("sp_name",cnnt);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@DataID",SqlDbType.VarChar, 15);

cmd.Parameters["@DataID"].Value = "XXXXX";

cnnt.Open();

cmd.ExecuteNonQuery(); //不傳回

cmd.ExecuteScalar(); //傳回純量

DataCont.預存程式名(參數值, ……);

DataCont. 預存程式名(參數名=參數值, ……)


DataBind()的範例之一:

RadioButtonList1.DataSource = p2;

RadioButtonList1.DataTextField = "ApplicationName";

RadioButtonList1.DataValueField = "ApplicationId";

RadioButtonList1.DataBind();

條件式的兩種寫法:

.Where("it.AddressID = @addressId", new ObjectParameter("addressId", newAddressId));
.Where(p=>p.AddressID==newAddressId);

1.從模型瀏覽器中,使用滑鼠右鍵


2.利用實體編輯頁上,利用滑鼠右鍵


選取SotredProcedure 與對應的 Function 名稱,並指定傳回型別(只能選「實體」)



有關預存程序輸入的參數設定,請參考下一頁的圖,而回傳值則由「實體」接收:


沒有留言:

張貼留言