LINQ表間關聯執行分析

2021-09-03 03:45:16 字數 3033 閱讀 7525

在資料庫中,經驗有兩個表關聯的情況,也就是乙個表中的主鍵為另乙個表的外來鍵,在ado.net時,如果向兩個表中同時添中資料,我們通常做三步sql操作,第一步:新增主表資料,第二步:得到主表中的主鍵,第三步:新增子表資料,在通常狀況下,這些都是在事務中。

先看一下資料庫表結構。乙個表為父表(這裡為了說明技術,表沒有具體意義),名字為fathertable如下:

還有乙個子表,名字為sontable如下:

兩個表之間有下圖這樣乙個關係:

先看一下ado.net如何實現:

class

testdemo

catch (exception exc)

finally

} }

ado.net

的事務沒有什麼好說的,現在來看看用linq怎麼實現,首先新增乙個「linq to sql類」,在「伺服器資源管理器」中連線資料庫,然後選中fathertable和sontable表,如下圖

接下來,程式設計來實現新增操作,**如下:

class

testdemo

} 運後的結果是一樣的。用ado.net,我們自己寫的sql語句,清楚我們對資料執行了什麼操作,上面的用linq to sql做的話,就不知道系統執行了什麼操作。我們看見系統呼叫了dataclasses1datacontext類的submitchanges,這個方法在dataclasses1datacontext找不到,它是從datacontext繼承下來的。我們用工具reflector檢視,submitchanges是呼叫有參的submitchanges(conflictmode),這個方法**如下:

public virtual void

submitchanges

(conflictmode

failuremode)

if (this.provider

.connection

.state

== connectionstate

.closed)

transaction = this.provider

.connection

.begintransaction

(isolationlevel

.readcommitted);

this.provider

.transaction

= transaction;

new changeprocessor

(this.services

, this).submitchanges

(failuremode);

this.acceptchanges

();

this.provider

.clearconnection

();

transaction.commit

(); }

catch

catch

}throw; }

return; }

finally

} }

new changeprocessor

(this.services

, this).submitchanges

(failuremode);

this.acceptchanges

(); }

finally

}我們清楚的看到,這裡面啟用了事務,與我們ado.net的做法是一樣的。事務有了,sql語句怎麼樣?繼續查詢submitchanges

方法,**如下:

internal void

submitchanges

(conflictmode

failuremode)

else if (obj2.isdeleted)

else

}else if (obj2.ispossiblymodified) }}

}catch (changeconflictexception)

if ((conflictlist..count " href="" target=_blank>count

> 0) && (failuremode == conflictmode

.failonfirstconflict))

}if (conflictlist..count " href="" target=_blank>count

> 0)

" href="" target=_blank>count);

}this.inserteditems, list deleteditems);" href="" target=_blank>postprocessupdates

(inserteditems, deleteditems);

}如果繼續下付出,會發現查詢許多類,能隱約看出系統在組織sql語句。

與其在這裡找,不如到sql裡等它生成的sql語句看看。

開啟sql的跟蹤工具,執行結果如下圖:

exec sp_executesql n'insert into [dbo].[fathertable]([name])

values (@p0)

select convert(int,scope_identity()) as [value]',n'@p0 varchar(4)',@p0='

王五'

執行了兩個操作,乙個添中,乙個查詢,查詢的是新增後自動生成的id值,另外兩個語句如出一轍,單從sql語句的角度看,多了兩個查詢,這在一定程度上沒有我們自己寫的sql語句簡單,多了子表中的乙個查詢。

SQL server基礎之(表間關聯)

首先先準備一些資料 e r圖 學生 學號,姓名,性別,生日,班級,密碼 課程 編號,課程 分數 學號,編號,分數 很簡單的三個表。接著我們來用幾種常見的連線方法把三張表連線在一起 注意 三張表之間的關係 將三張表整合到一起,顯示全部資訊 1 內連線 select student.sid,studen...

003 通過表間關聯來查詢

rails不要求在遷移任務中建立外來鍵約束,在遷移任務中建立project id欄位後在project和task模型中加上相應的宣告。project.rb has many tasks task.rb belongs to project projects controller.rb def sho...

針對Oracle大表執行表分析

報表 資料庫相當於乙個資料倉儲,資料量一般來說都比較大,這個時候效能就要特別注意。為了促使 oracle 選擇最優的執行計畫,最好定期進行表分析,以使oracle得到正確的統計資訊。一般如果資料分布和表結構發生變化的話,就要重新進行表分析。報表資料庫資料分布發生變化時有發生。所以建議報表庫進行定期的...