2010-10-23 191 views
34

我想在C#中合併兩個IQueryable列表的記錄。我嘗試如何合併兩個IQueryable列表

IQueryable<MediaType> list1 = values; 
IQueryable<MediaType> list2 = values1; 
obj.Concat(obj1); 

IQueryable<MediaType> list1 = values; 
IQueryable<MediaType> list2 = values1; 
obj.Union(obj1); 

但如果list1爲空,那麼結果列表也是空的。在我的情況下,list1可以是空的,但list2可以有記錄。我應該如何合併它們?

回答

52

您沒有使用的返回值 - 就像所有其他的LINQ運營商,該方法不改變現有的序列 - 它返回新的序列。所以,試試這個:

var list3 = list1.Concat(list2); 

var list4 = list1.Union(list2); 

Union是一組操作 - 它返回不同的值。

Concat只是返回第一個序列中的項目,然後是第二個序列中的項目;結果序列可以包含重複的項目。

您可以將Union視爲Concat,然後是Distinct

+0

IQuerable中的元素是否可以排序?如果是,請同時執行這兩個狀態以相同的方式保存訂單? – CowboyBebop 2015-02-10 16:40:36

+1

@CowboyBebop:它們*可以被定購 - 例如,IOrderedQueryable擴展了IQueryable。在LINQ to Objects中,訂單是通過這些操作保留的 - 但我懷疑它是否保證了進程外查詢提供程序。 – 2015-02-10 17:08:44

+0

有趣的部分是你仍然可以使用聯合鏈查詢,所以它不會被執行,結果仍然是'IQueryable ',這幫助了我很多。 – Niklas 2017-09-19 07:11:24

1

即使

var result = Enumerable.Concat(list1, list2); 

不起作用?

,並確保列表是空的,不爲空:

var result = Enumerable.Concat(
    list1 ?? Enumerable.Empty<MediaType>() 
    list2 ?? Enumerable.Empty<MediaType>()); 

相關搜索:

var result = Enumerable.Concat(
    list1.AsEnumerable(), 
    list2.AsEnumerable()); 
+0

不,我已經嘗試了兩種方法:( – 2010-10-23 11:55:41

+0

@Fraz:請嘗試我的每個變體並報告結果 – abatishchev 2010-10-23 11:58:23

-2

另一種選擇,我發現:
宣告:
IEnumerable<int> usersIds = new int[0];
例如一個循環中:

foreach (var id in Ids) { 
      IQueryable<int> _usersIds = bl.GetUsers(id).Select(x => x.UserID); 
      usersIds = usersIds.Concat(_usersIds); 
     } 
var ids = usersIds.Distinct(); 

現在usersIds和IDS(如不同)包含所有用戶,爲IEnumerable -int-的id