Ok, a few minutes late, but I get it! Here is the code:
public static class LinqExtensions { public static int CountAll(this IEnumerable<IQueryable<object>> queries) { if (queries == null || !queries.Any()) { throw new ArgumentException("Queries parameter cannot be null or empty"); } Expression ex = Expression.Constant(0); foreach (var qy in queries) {
You use it as queries.CountAll()
, where the queries are IEnumerable<IQueryable<object>>
, as in Adrian's answer, or even just IEnumerable<IQueryable>
.
Here is an example SQL result from the profiler:
exec sp_executesql N'SELECT @p0 + (( SELECT COUNT(*) FROM [A] AS [t0] WHERE [t0].[i1] >= @p1 )) + (( SELECT COUNT(*) FROM [B] AS [t1] WHERE [t1].[i2] >= @p2 )) + (( SELECT COUNT(*) FROM [C] AS [t2] WHERE [t2].[i3] >= @p3 )) AS [value]',N'@p0 int,@p1 int,@p2 int,@p3 int',@p0=0,@p1=2,@p2=2,@p3=2
What is the view
var a = db.GetTable<A>(); var b = db.GetTable<B>(); var c = db.GetTable<C>(); var q1 = a.Where(v => v.i1 >= 2); var q2 = b.Where(v => v.i2 >= 2); var q3 = c.Where(v => v.i3 >= 2); var queries = new IQueryable<object>[] { q1,q2,q3 };
Note that A, B and C are different objects / tables with different property / column numbers and that expressions are random, where are the filters.
source share