【问题标题】:How to merge result IQueryable<T> together?如何将结果 IQueryable<T> 合并在一起?
【发布时间】:2009-12-14 16:53:43
【问题描述】:

如果我从不同的 linq Query 获得两个结果 IQueryable 并且我想将它们合并在一起并返回一个结果,该怎么做? 例如,如果:

var q1 = (IQueryable<Person>).....;
var q2 = (IQueryable<Person>).....;

如何将 q1 和 q2 合并在一起并得到类似的结果

var q = (IQueryable<Person>)q1.Union(q2);

【问题讨论】:

    标签: linq


    【解决方案1】:

    你有它,q1.Union(q2)Union 位于带有 Queryable 的 System.Linq 命名空间中。

    【讨论】:

    • 如果我错了,请纠正我,但在此解决方案中,IMO 必须考虑联合参数是 IEnumerable,因此它不会在数据库中进行联合。此外,它会在数据库中调用两次,因为参数是 IEnumerable,即使一个传递了 IQueryable,它也会作为对数据库的另一次调用执行。只是想指出这一点,如果性能是内存联合或数据库调用的问题
    • @fmaccaroni 我提出这个问题是因为我的想法完全一样。然后我在 LINQPad 5 中做了一个快速测试,应该使用 LINQ-to-SQL。 q1.Union(q2) 产生 SELECT * FROM (SELECT * FROM q1 UNION SELECT * FROM q2)。因此,LINQ 将 IEnumerable 参数转换回 IQueryable 的某个地方。
    【解决方案2】:

    你可以试试Concat方法

    类似的东西

    int[] i1 = new int[] { 1, 2, 3 };
    int[] i2 = new int[] { 3, 4 };
    //returns 5 values
    var i3 = i1.AsQueryable().Concat(i2.AsQueryable());
    //returns 4 values
    var i4 = i1.AsQueryable().Union(i2.AsQueryable());
    

    Union 只会给你 DISTINCT 值,Concat 会给你 UNION ALL

    【讨论】:

    • Union 将使用默认的比较器,如果他没有指定一个,每个 Person 可能会有不同的对象引用。
    【解决方案3】:
    (q1.Union(q2)).AsQuerable()
    

    【讨论】:

    • Union 方法返回一个 Queryable。
    • Concat 可能更合适
    【解决方案4】:

    不可能使用 NHibernate 联合。

    您必须在客户端处理而不是 DB 处理联合。 我使用 AsEnumerable 将 IQueryable 转换为 IENumerable,然后使用 Concat 扩展。

    var allItems = q1.AsEnumerable().Concat(q2)

    问候, 塞巴斯蒂安

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2020-12-22
      • 2011-06-21
      • 1970-01-01
      • 2015-07-30
      相关资源
      最近更新 更多