【问题标题】:How to merge two IQueryable lists如何合并两个 IQueryable 列表
【发布时间】:2011-04-29 13:30:54
【问题描述】:

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

【问题讨论】:

    标签: c# iqueryable


    【解决方案1】:

    偶数

    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:请尝试我的每个变体并报告结果
    【解决方案2】:

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

    var list3 = list1.Concat(list2);
    

    var list4 = list1.Union(list2);
    

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

    Concat 只返回第一个序列中的项目,然后返回第二个序列中的项目;生成的序列可以包含重复项。

    您可以将Union 视为Concat,后跟Distinct

    【讨论】:

    • 可以对 IQuerable 中的元素进行排序吗?如果是这样,这两个语句是否都以相同的方式保留顺序?
    • @CowboyBebop:他们可以被订购 - 例如IOrderedQueryable 扩展IQueryable。在 LINQ to Objects 中,这些操作保留了顺序 - 但我怀疑它对于进程外查询提供程序是否有保证。
    • 有趣的部分是您仍然可以使用 Union 链接查询,因此它不会被执行,结果仍然是 IQueryable&lt;T&gt;,这对我来说帮助很大。
    • 您好,当我将此代码用于 IQueryable 方法时,它会显示结果错误的错误。 iq1 = db.MyModel.Where(m => m.CategoryId == 1);和 iq2 = db.MyModel.Where(m => m.CategoryId==2);然后 iqResult = iq1.Concat(iq2);当我在这一行中调试时出现错误。
    • @AProgrammer:我建议你问一个比“我出错”更详细的新问题。
    【解决方案3】:

    我发现的另一个选项:
    声明:
    IEnumerable&lt;int&gt; 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(as distinct) 包含所有用户的 id 作为 IEnumerable -int-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 2015-10-15
      • 2012-10-15
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多