2016-05-05 2 views
0

я в настоящее время получить результаты функция 2 агрегировать таким образом:Объединить Агрегатные функции на нескольких таблиц с использованием Entity Framework

var fooCount = ctx.Foo.Count(); 
var barCount = ctx.Bar.Count(); 

Это производит 2 различных запросов SQL. Я ищу способ объединить их в один запрос.

В простой SQL я могу объединить эти два запроса таким образом:

SELECT 
    (SELECT COUNT(*) FROM Foo) AS FooCount, 
    (SELECT COUNT(*) FROM Bar) AS BarCount 

Как мы можем сделать это с помощью Entity Framework? Все, что я нашел, было для multiple aggregate function in the same table. Но в моем случае это разные таблицы.

Я пытался что-то вроде этого, но безуспешно:

var query = from together in (new 
{ 
    FooCount = db.Foo.Count(), 
    BarCount = db.Bar.Count() 
}) select together; //<-- visual studio let me not write "select together;" 
+0

Вы создаете Анонимные типы, а не 'IEnumerable', почему не' новый ИНТ [] {ctx.Foo.Count(), ctx.Bar.Count()} ' –

+0

Я пытаюсь выполнить это в одном запросе. @ArturoMenchaca –

+0

@ArturoMenchaca Каждый вызов 'Count' собирается создать отдельный SQL-вызов, и OP хочет объединить их в один. – juharr

ответ

2

Я думаю, что вы хотите что-то вроде этого. В основном группировка по константе позволяет сделать агрегацию подсчета как IQueryable<int>, а затем вы можете пересечь их. Но я не знаю, что это того стоит. В основном вы читаете читаемость, предположительно, некоторое увеличение производительности.

var counts = (from fc in (
       from f in ctx.Foo 
       group f by 1 into fgrp 
       select fgrp.Count()) 
      from bc in (
       from b in ctx.Bar 
       group b by 1 into bgrp 
       select bgrp.Count()) 
      select new { FooCount = fc, BarCount = bc }).Single(); 
+0

Спасибо. Похоже, что он генерирует «кросс-соединение», но я предполагаю, что это не проблема, потому что он вычисляет «Сумма» раньше? –

+1

Да, кросс-соединение будет против двух наборов, каждый из которых имеет один ряд. Я бы ожидал, что SQL из этого примерно будет иметь тот же план запросов, что и ваш SQL, но не держите меня в этом. Лучше всего протестировать это, чтобы делать счет отдельно, чтобы определить, что быстрее, предполагая, что это ваша цель. – juharr

Смежные вопросы