兩個list集合得到linq外連線的效果

2021-07-07 02:10:08 字數 3262 閱讀 9674

網路

像這種怎麼寫?

你寫的語句僅僅是左外連線,而你要的結果卻是左外連線和右外連線的交集(以user_id為鍵做比較)。

當然通常我們不會這樣做,因為太低效。

乙個簡單點的辦法是先取兩個list的user_id做並集運算得到所有的主鍵,然後依據主鍵進行子查詢。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

vartmp1 =      list1

.select(i => i.user_id)

.union(list2.select(i => i.user_id))

.tolist()

.select(id =>

;

});

稍微解釋下。首先我們拿到list1和list2的所有user_id,然後使用union擴充套件方法做並集運算得到匿名ienumerable,裡面的值是。對其中每乙個值id,在list1和list2上比較user_id==id得到i1和i2。根據i1和i2是否為空決定該如何select結果集。

等價的查詢子句語法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

vartmp11 =fromidin

(fromi1inlist1selecti1.user_id)

.union((fromi2inlist2selecti2.user_id))

.tolist()

letr1 = (fromi1inlist1wherei1.user_id == idselecti1)

.firstordefault()

letr2 = (fromi2inlist2wherei2.user_id == idselecti2)

.firstordefault()

selectnew

;

如果想利用現有的**,我們還可以為newlist補上它缺失的記錄。檢查一下list2中所有user_id沒有在list1中出現的記錄即可。

1

2

3

4

5

6

7

8

9

10

11

newlist = newlist.concat(

frombinlist2

where!(fromainlist1selecta.user_id).contains(b.user_id)

selectnew

);

等價的查詢符語法:

1

2

3

4

5

6

7

8

9

10

11

newlist = newlist.concat(

list2

.where(i2 => !list1.select(i1 => i1.user_id).contains(i2.user_id))

.select(b =>new

));

還有其他幾種方式可以滿足你的需要,這裡就不過多解釋了。有問題請追問。

兩個List資料集合合併成乙個List

開發工具與關鍵技術 visual studio 與c 查詢兩個差不多相同的表,乙個是入庫表,乙個是退貨表,字段大致相同,但是有所差異,入庫表的數量和所有金額都是正數,退貨表的數量和金額都是負數,所以不能join鍊錶查詢,需要分開查詢出兩個tolist 但是return只能有乙個,不能return兩次...

Java實現比較兩個List集合是否相等

參考的文章兩個list比較內容是否一樣寫的,主要對文章講到的比較演算法的具體實現進行了完善改造。比較兩個list集合是否相等 注 1.如果乙個list的引用為null,或者其包含的元素個數為0,那麼該list在本邏輯處理中都算作空 2.泛型引數e涉及到物件,所以需要確保正確實現了對應物件的equal...

Java實現比較兩個List集合是否相等

比較兩個list集合是否相等 注 1.如果乙個list的引用為null,或者其包含的元素個數為0,那麼該list在本邏輯處理中都算作空 2.泛型引數e涉及到物件,所以需要確保正確實現了對應物件的equal 方法。param list1 param list2 return public static...