在LINQ中實現多條件聯合主鍵LEFT JOIN

2021-09-25 23:42:11 字數 1623 閱讀 3206

我昨天遇到乙個linq下使用多條件比對產生left join的問題,經過深入研究,終於解決了,也讓我學到了新的東西,特地拿來分享。

例項:有一張庫存異常變更檢視kcyd,倉庫id[ckid]和物品id[spxxid]是該檢視的唯一約束。有一張物品表item,物品id[item_id]是主鍵。還有一張表是統計**和次品庫存數量的檢視spkc,倉庫id[ckid]和物品id[spxxid]是該檢視的唯一約束。現在的要求是根據條件查詢庫存異常變更的物品資訊,即要求kcyd左聯item再左聯spkc。kcyd和item的公共欄位是物品id,kcyd和spkc的公共欄位是倉庫id和物品id。

我原先想到的寫法如下:

var query = from k in dbcontext.kcyd

join i in dbcontext.item

on k.spxxid equals i.item_id into g

from gc in g.defaultifempty()

join s in dbcontext.spkc

on k.spxxid equals s.spxxid into g1

from gc1 in g1.defaultifempty()

where k.ckid == gc1.ckid

select new

;但是生成的sql語句,kcyd和item表是left outer join的,但是聯spkc表卻變成了inner join,這是為啥呢,經過一番折騰下來,發現問題出在where k.ckid == gc1.ckid,如果把這個條件去掉的話,那就成了left outer join了,然後我就在想這個條件應該放在哪呢,linq裡面到底支不支援聯合主鍵的問題呢,在網上搜了半天,發現可以用 on new equals new into g的方法,於是修改**如下:

var query = from k in dbcontext.kcyd

join i in dbcontext.item

on k.spxxid equals i.item_id into g

from gc in g.defaultifempty()

join s in dbcontext.spkc

on new equals new into g1

from gc1 in g1.defaultifempty()

select new

;但是很不給力的是這樣居然提示錯誤:the type arguments cannot be inferred from the query.

簡直就是杯具,難道linq不支援這樣搞?唉,在我絕望的時候同事為我看出了端倪,原來equals兩邊的引數欄位名的大小寫必須完全匹配。即完整**如下:

var query = from k in dbcontext.kcyd

join i in dbcontext.item

on k.spxxid equals i.item_id into g

from gc in g.defaultifempty()

join s in dbcontext.spkc

on new equals new into g1

from gc1 in g1.defaultifempty()

select new

;大功告成!

linq中如何實現多個條件的聯合查詢

目前接觸處理資料這一塊比較多,在處理記憶體中的資料來源的時候我一般使用的是linq,linq使用起來像sql語句一樣,用法簡單,功能強大。最近需要實現乙個從兩個不同的檔案讀取不同的資料,然後根據這兩個資料的一些字段經行聯合,然後把他們的結果放到乙個資料來源裡面裡啊,一般的聯合查詢兩個資料來源,都是通...

django中如何實現多條件查詢

一 使用字典儲存查詢條件 獲取查詢條件 start date request.post.get start date end date request.post.get end date order type request.post.get order type order nature requ...

Linq多表聯合查詢,在View中繫結資料

newclass 裡面有表1的字段和表2的字段 public class jointab1 2 public string name 控制器中action public actionresult index tolist viewdata query query return view view中 ...