Linq-эквивалент агрегатной функции для нескольких таблиц в одной поездке базы данных - PullRequest
2 голосов
/ 29 января 2020

У меня есть табличная функция, которая возвращает имена таблиц и количество записей в этой таблице:

CREATE FUNCTION [dbo].[ufnGetLookups] ()
RETURNS
@lookupsWithItemCounts TABLE 
(
    [Name] VARCHAR(100),
    [EntryCount] INT
)

AS 
BEGIN
    INSERT INTO @lookupsWithItemCounts([Name],[EntryCount])
     VALUES
               ('Table1', (SELECT COUNT(*) FROM Table1)),
               ('Table2', (SELECT COUNT(*) FROM Table2)),
               ('Table3', (SELECT COUNT(*) FROM Table))

    RETURN;
END

Каким будет эквивалент Linq вышеупомянутой простой функции? Обратите внимание, что я хочу получить результат одним выстрелом, и скорость операции для меня очень важна. Если я пойму, что преобразование linq в sql приведет к огромному громоздкому sql с падением производительности, я бы предпочел придерживаться своей существующей пользовательской функции и забыть об эквивалентном linq.

Ответы [ 2 ]

1 голос
/ 30 января 2020

Не EF парень, и не уверен, что это будет более производительным.

Select TableName = o.name
      ,RowCnt    = sum(p.Rows)
  From sys.objects    as o
  Join sys.partitions as p on o.object_id = p.object_id
 Where o.type = 'U'
   and o.is_ms_shipped = 0x0
   and index_id < 2  -- 0:Heap, 1:Clustered
   --and o.name in ('Table1','Table2','Table3' )   -- Include (or not) your own filter
Group By o.schema_id,o.name

Примечание: Wi sh Я мог бы вспомнить источник этого, но я ' Я использовал его в процессе моего обнаружения.

1 голос
/ 30 января 2020

Вы можете сделать это с помощью запроса UNION. EG

var q = db.Books.GroupBy(g => "Books").Select(g => new { Name = g.Key, EntryCount = g.Count() })
          .Union(db.Authors.GroupBy(g => "Authors").Select(g => new { Name = g.Key, EntryCount = g.Count() }));

var r = q.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...