Простой SQL-запрос к Linq с групповыми и агрегатными функциями - PullRequest
10 голосов
/ 18 октября 2010

Я борюсь с linq, пытаясь изучить синтаксис, и я не могу понять, как выполнить следующий простой запрос

SELECT DISTINCT
    user.firstname,
    user.lastname,
    COUNT(invoice.amount),
    SUM(invoice.amount)
FROM
    company_user
    INNER JOIN 
        user
    ON 
        company_user.user_id = user.user_id
    INNER JOIN 
        invoice
    ON
        invoice.user_id= invoice.user_id
WHERE 
    company_user.company_id = 1
GROUP BY
    user.firstname,
    user.lastname,
GO

Любая помощь, превращающая это в linq, была бы великолепна.

Ответы [ 4 ]

16 голосов
/ 18 октября 2010

Ваш запрос должен быть очень близок к этому:

var query =
    from cu in company_user
    where cu.company_id == 1
    join u in user on cu.user_id equals u.user_id
    join i in invoice on u.user_id equals i.user_id
    group i.amount by new
    {
        u.firstname,
        u.lastname,
    } into gs
    select new
    {
        firstname = gs.Key.firstname,
        lastname = gs.Key.lastname,
        count = gs.Count(),
        sum = gs.Sum(),
    };

Наслаждайтесь!

4 голосов
/ 18 октября 2010

Поскольку в операторе упоминается синтаксис обучения, вот беглая версия:

company_user
    .Where(x => x.company_id == 1)
    .Join(
        user,
        x => x.user_id,
        x => x.user_id,
        (o,i) => new { 
            FirstName = i.firstName, 
            LastName = i.lastName,
            InvoiceCount = invoice.Count(y => y.user_id == o.user_id),
            InvoiceSum = invoice.Where(y => y.user_id == o.user_id).Sum(y => y.amount)
        }
    ).GroupBy(x => new { x.FirstName, x.LastName })
    .Distinct()
0 голосов
/ 18 октября 2010

Я думаю, что у вас есть несоответствие в вашем предложении соединения - вы внутренне присоединяете счет к себе по user_id. Я предполагаю, что вы намеревались присоединиться к этому пользователю?

В любом случае, вот мой лучший снимок:

from inv in invoices
group inv by new { inv.user_id } into userInv
join usr in users on userInv.Key.user_id equals usr.user_id
where usr.company_user.company_id = 1
select new
{
    usr.firstname,
    usr.lastname,
    amount = inv.Count(),
    sum = inv.Sum(amt => amt.amount)
}

Что касается предложений LINQ, я бы определенно предложил вам скачать и поиграть с LINQPad . Я все время использую его для тестирования операторов LINQ без Visual Studio. Он также преобразует ваши операторы LINQ в SQL, что, вероятно, представляет для вас особый интерес.

Редактировать: Заявление Enigmativity намного ближе к тому, что вы просили, чем мое. Я не сталкивался с группировкой столбцов в примерах, с которыми работал.

0 голосов
/ 18 октября 2010

эй, этот сайт может вам помочь:

101 Образцы Linq

содержит примеры большинства функций linq.напишу для вас позже, если кто-то этого не сделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...