使用linq語句進行聯表查詢

2022-02-25 23:43:14 字數 1349 閱讀 6596

假設你有乙個父表(例如:汽車),其關聯乙個子表,例如輪子(一對多)。現在你想對於所有的父表汽車,遍歷所有汽車,然後列印出來所有輪子的資訊。預設的做法將是:

select carid from cars;

然後對於每個汽車:

select * from wheel where carid = ?

這會select 2個表一共n(主表的行數)+1(父表)次,故稱為select n+1問題。

考察下面的**。假設provincemeeting是乙個會議表,meetsign是另外乙個會議簽到表,provincemeeting和meetsign是一對多的關係:

var ids = container.provincemeeting.select(f =>f.id).tolist();

var signentities =container.meetingsign.tolist();

foreach (var id in

ids)

每次迴圈都會連線資料庫,執行一條sql語句,select n + 1問題,很消耗效能。

改善後的寫法:

//

這是我曾經的寫法,先遍歷獲取主表和所有的子表資料儲存在陣列中,然後再foreach迴圈查詢取出每個主表對應的子表資訊,

var entities = container.provincemeeting.tolist();

var signentities =container.meetingsign.tolist();

foreach (var item in

entities)

我們知道foreach會強制linq執行,於是,我們可以想象這也是乙個select n+1問題的例子:先獲得所有provincemeeting(select * from provincemeeting),然後遍歷,再去select 表meetingsign,共select n+1次。(當然這裡我把資料都啦取出來,儲存在記憶體中,進行操作相當也查詢了兩次,但隨後我還要遍歷迴圈運算元組)。解決方法:使用乙個匿名物件作為中間**,預先將兩個表join到一起

最佳寫法:

var  results = container.provincemeeting.select(f => new );
我們對結果新增監聽,執行效果如下:

主表和子表對應的關聯資料,繫結在了一起,不止**簡單,執行效率也高出了不少!

sql 語句 聯表查詢

1 replace into 用replace into 替代insert into 根據唯一主鍵判斷 無則插入,有則刪除重新插入 覆蓋 不適用自增id做主鍵。因為會刪除id.2.同表 分銷查詢下級每代的人數 內聯查詢 獲取第二代的人 select a.user name,a.reg time,a....

使用linq 進行Group by 查詢

上圖是資料庫表 需求是要統計出來 不合格 top 10 其中 ngcode 200代表合格 其他均不合格 sql 語句 如下 select top 10 ngcode as defectcode count 1 as count from dbo tblpassstationdata where n...

sql語句聯表查詢之(join on)

表1 表的結構 bumen create table if not exists bumen bid int 10 not null auto increment,mingcheng varchar 30 default null,jingli varchar 30 default null,tel...