Хорошо, несколько минут поздно, но я понял! Вот код:
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)
{
// create count expression
var expression = Expression.Call(
typeof(Queryable),
"Count",
new[] { qy.ElementType },
qy.Expression
);
ex = Expression.Add(ex, expression);
}
return queries.First().Provider.Execute<int>(ex);
}
}
Вы можете использовать его в качестве queries.CountAll()
где запросы является IEnumerable<IQueryable<object>>
как в ответ Эдриана или даже просто IEnumerable<IQueryable>
.
Вот результат выборки SQL из профилировщика:
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
Который является представление
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
};
Заметим, что А, В и С являются различные объекты/таблицы с различным числом свойств/columns и что выражения являются случайными, если фильтры.
ли вы найти решение? –
@AdrianIftode: нет, и всего лишь 11 просмотров (вероятно, половина от меня), я не очень надеюсь на stackoverflow, чтобы помочь. – jmoreno
щедрость должна исправить это :) –