如何将结果IQueryable <T>合并在一起?

Ken*_*hou 23 linq

如果我从不同的linq Query获得两个结果IQueryable并且我想将它们合并在一起并返回一个作为结果,如何对此?例如,如果:

var q1 = (IQueryable<Person>).....;
var q2 = (IQueryable<Person>).....;
Run Code Online (Sandbox Code Playgroud)

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

var q = (IQueryable<Person>)q1.Union(q2);
Run Code Online (Sandbox Code Playgroud)

Yur*_*ich 25

你拥有它,q1.Union(q2).该联盟是在System.Linq的命名空间可查询.

  • 如果我错了,请纠正我,但在此解决方案中IMO必须考虑到union参数是IEnumerable,因此它不会在数据库中执行Union.此外,它将在数据库中调用两次,因为该参数是一个IEnumerable,即使传递一个IQueryable,它也将作为另一个数据库调用执行.如果性能是on-memory-union或对数据库的调用的问题,只是想指出这一点 (3认同)
  • @fmaccaroni 我提出这个问题是因为我也有同样的想法。然后我在 LINQPad 5 中进行了快速测试,它“应该”使用 LINQ-to-SQL。`q1.Union(q2)` 生成 `SELECT * FROM (SELECT * FROM q1 UNION SELECT * FROM q2)`。因此,LINQ 在幕后某处将“IEnumerable”参数强制转换回“IQueryable”。 (2认同)

Adr*_*der 16

您可以尝试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());
Run Code Online (Sandbox Code Playgroud)

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

  • 联盟将使用默认比较器,如果他没有指定一个,则每个人可能会有不同的对象引用. (5认同)