網頁

LINQ and Entity Framework筆記

Entity Framework 架構


圖一

圖二

LINQ 分頁


Function GetPaging(index As Integer, size As Integer) As IEnumerable
Dim db As New NorthwindEntities()
' 要Skip的筆數
Dim SkipPageSize As Integer = index * size
Dim result = (From n In db.Products …).Skip(SkipPageSize).Take(size)
Return result

End Function

LINQ 是否有資料


If (result.Count() = 0) Then
' 無資料處理

End If

LINQ 預先編譯


' 1.宣告全域變數
ReadOnly cq = System.Data.Objects.CompiledQuery.Compile(Of QnoDCEntities, DateTime, IQueryable(Of Orders))(Function(ctx, orderDate) From o In ctx.Orders Where o.OrderDate < orderDate Order By orderDate Select o)

' Compile(Of 實體, 參數1型別, 參數2型別, … , 參數n, IQueryable(Of 物件)) 參數型別依查詢式所需,可以有多個。  IQueryable(Of 物件)即Data Source。


Function(實體參數, 參數1名稱, 參數2名稱, … , 參數n名稱)  From o In DataSource … 此處的DataSource必須與IQueryable(Of 物件)對應  Where … > 參數1名稱 AndAlso ... < 參數2名稱 … 以參數進行過濾

' 2.主程式
Dim Order = cq.Invoke(QnoDCEntities, orderdate) 傳入實體及參數

' 可參考:http://msdn.microsoft.com/zh-tw/library/bb896297.aspx

LINQ 之CURD

' LINQ to Entity
' 新增
context.AddTo(EntityClass)(Data)
context.SaveChanges()
' 更新
result.欄位 = …
context.SaveChanges()
' 刪除
context.DeleteObject(Data)
context.SaveChanges()

' Entity Framework 4.1
' 新增
context.物件.Add(Data)
' 例如: context.Blogs.Add(blog)
context.SaveChanges()
' 更新
Dim blog = context.Blogs.Find(id)
context.Entry(blog).State = System.Data.EntityState.Modified
db.SaveChanges()
' 刪除
Dim blog = context.Blogs.Find(id)
db.Entry(blog).State = System.Data.EntityState.Deleted
db.SaveChanges()

串連 LINQ


Function Query1(…) As IQueryable(Of …)
    Return From … In …
End Function

Function Query2(Q1 As IQueryable(Of …), …) As IQueryable(Of …)
    Return From … In Q1 …
End Function

把Query1當成Query2的Data Source。

LINQ交易

1. SaveChanges() 已預設使用交易。
2. 兩個DataContext:使用Explicit交易。
3. 兩個Database:使用TransactionScope交易。

EDM自動跳號

1. Identiry (自動跳號)
2. computed ( Insert, Update都會更新),例如,DateTime型別。

關聯載入

1. 預設Lazy Loading (需要時才載入)
2. Load() 方法
3. Include(…) 方法

Create Query

方便組裝E-SQL。(Dynamic Query更好)
例如,
Dim Rusult = context.CreateQurey(Of …)(“E-SQL”, ObjectParameter(“Name”, …))

Entity Client

用法與SqlClient一樣。
EntityClient + E-SQL。
SqlClient + T-SQL。

E-SQL

1. 使用別名。
2. Select Value 別名。

Dynamic Query

Dim Result = context.Orders.Where(“it.OrderId = @Id”, New ObjectParameter(“Id”, …))

it是關鍵字。

EDMX 之 POCO

.edmx --> 非POCO,繼承EntityObject --> 序列化(XML)肥大  Web Service
EF 4.1 --> 轉換為POCO --> 序列化(JSON) --> WCF

DbContext

ASP.NET MVC可使用DbContext。(EF 4.1)

' 新增:context.Orders.Add(Data)
' 更新:
' 刪除:context.Orders.Remove(Data)
' 更OOP。

State

改變State可更新、刪除(配合Find())
' 找到Data
Dim Result = context.Orders.Find(“PK”)
context.Entity(…).State=EntityState.{Modified | Deleted}
SaveChanges()

批次新增

批次新增可先Disable Changes Tracker
db.Configuration.AutoDetectChangesEnabled = False
批次新增完成後,再Enable。

單純Query

單純Query,使用No Tracker
Dim Result = From o In db.Orders.AsNoTracking() Select o

Local查詢

Local技術,將連線資料處理模式帶到離線資料處理模式。
Dim Result = From o In db.Orders.Local Where o.SerialNumber.StartsWith("AK42") Select o

使用T-SQL

' 查詢
Dim Result = db.Orders.SqlQuery("select * from orders")
' 異動
Dim Result = db.Database.ExecuteSqlCommand("Insert ... Value {0}, {1}", 參數1, 參數2)

DbContext使用E-SQL

Dim Result = CType(db, System.Data.Entity.Infrastructure.IObjectContextAdapter)
.ObjectContext.CreateQuery("E-SQL")

1 則留言:

  1. http://social.msdn.microsoft.com/Forums/zh-TW/238/thread/5b113206-30dd-48ad-b639-270bd12dad34

    StoreGeneratedPattern 更新問題,可參考以上回答。

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。