SQL для LINQ - несколько групп по операторам и объединение - PullRequest
0 голосов
/ 13 ноября 2018

Работа над разработкой запроса LINQ для возврата тех же результатов, что и этот запрос SQL:

SELECT 
  x.departmentid, 
  Count(x.transactionid) 
FROM 
  (
    SELECT 
      t.id AS transactionid, 
      tp.departmentid AS departmentid 
    FROM 
      history.transactions t 
      JOIN history.transactionproducts tp ON t.id = tp.transactionid 
    GROUP BY 
      t.id, 
      tp.departmentid
  ) AS x 
GROUP BY 
  x.departmentid

Я изо всех сил пытаюсь понять, как я могу группировать по отделу несколько раз в LINQ.

Вот что я пробовал до сих пор:

var deptTransactionsCount = from transaction in transactions
                                        join product in transactionProducts on transaction.Id equals product.TransactionId
                                        group transaction by new { product.TransactionId, product.DepartmentId }
                                        into groupedbyTransAndDept
                                        select new
                                                   {
                                                       DepartmentID = groupedbyTransAndDept.Key.DepartmentId,
                                                       TotalTransactionsCount = groupedbyTransAndDept.Count()
                                                   };

Опять же, я не уверен, как учесть множественные группы по заявлениям.

Вот результаты SQL-запроса: Результаты

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

По моему опыту, сложно создавать группы и объединения с Linq, вы можете создать представление в базе данных и использовать его вместо этого.

0 голосов
/ 13 ноября 2018

Вам не нужно делать ничего особенного, чтобы учесть несколько группировок.У вас есть производная таблица, которая является одной группой.Это один запрос.Исходя из этого, вы делаете другую группировку.Это еще один запрос.

var deptTransactionsCount = (
    from dept in (
        from t in transactions
        join tp in transactionProducts on t.Id equals tp.TransactionId
        group tp by new { tp.TransactionId, tp.DepartmentId } into groupedbyTransAndDept
        from transAndDept in groupedbyTransAndDept
        select new
        {
            transAndDept.TransactionId,
            transAndDept.DepartmentId
        })
    group dept by dept.DepartmentId into groupedByDept
    select new
    {
        DepartmentId = groupedByDept.Key,
        Count = groupedByDept.Count()
    }).ToList();

И поскольку это LINQ, вы можете выделить внутренний запрос, если это облегчит понимание того, что он делает.

var innerQuery =
    from t in transactions
    join tp in transactionProducts on t.Id equals tp.TransactionId
    group tp by new { tp.TransactionId, tp.DepartmentId } into groupedbyTransAndDept
    from transAndDept in groupedbyTransAndDept
    select new
    {
        transAndDept.TransactionId,
        transAndDept.DepartmentId
    };

var deptTransactionsCount = (
    from dept in innerQuery
    group dept by dept.DepartmentId into groupedByDept
    select new
    {
        DepartmentId = groupedByDept.Key,
        Count = groupedByDept.Count()
    }).ToList();
0 голосов
/ 13 ноября 2018

Я думаю, что мы можем упростить это.

var result = transactions.Select(transaction => new
        {
            DepartmentId = transactionProducts.FirstOrDefault(product =>
                product.TransactionId == transaction.Id)?.DepartmentId,
            TransactionIdCount = transactionProducts.Where(product =>
                product.TransactionId == transaction.Id)
                .Select(product => product.TransactionId).Count()
        })
...