如何合并两个IQueryable列表

69

我想在 C# 中合并两个 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可以有记录。我应该如何合并它们?

3个回答

101

你没有使用返回值-和所有其他LINQ运算符一样,该方法不会更改现有序列-它返回一个新序列。所以尝试这个:

var list3 = list1.Concat(list2);
或者
var list4 = list1.Union(list2);

Union是一种集合操作 - 它返回不同的值。

Concat仅仅返回第一个序列中的项,后面跟着第二个序列中的项;结果序列可以包含重复的项。

你可以把Union想象成Concat加上Distinct


可否对IQueryable中的元素进行排序?如果可以,那么这两个语句是否以相同的方式保留顺序? - CowboyBebop
1
@CowboyBebop:它们可以被排序 - 例如,IOrderedQueryable扩展了IQueryable。在LINQ to Objects中,使用这些操作可以保留顺序 - 但我怀疑对于外部查询提供程序来说,这并不是保证的。 - Jon Skeet
有趣的部分是您仍然可以使用Union链接查询,因此它不会被执行,结果仍将是IQueryable<T>,这在我的情况下非常有帮助。 - Niklas
你好,当我使用这些IQueryable方法的代码时,它显示结果错误。 iq1 = db.MyModel.Where(m => m.CategoryId == 1); 和 iq2 = db.MyModel.Where(m => m.CategoryId==2); 然后 iqResult = iq1.Concat(iq2); 当我在这一行调试时,我得到了一个错误。 - A Programmer
1
@AProgrammer:我建议您提出一个新问题,比“我遇到错误”更详细。 - Jon Skeet

6

即使

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

无法工作?

确保列表为空,而不是null:

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

也试试:

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

@Fraz:请尝试我的每个变体并报告结果。 - abatishchev

-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(作为不同的变量)包含所有用户的ID作为IEnumerable -int-。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接