Простой sql-запрос Linq с групповыми и агрегатными функциями
Я сражаюсь с 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, была бы большой.
Ответы
Ответ 1
Запрашиваемый запрос должен быть довольно близок к этому:
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(),
};
Наслаждайтесь!
Ответ 2
Так как op упомянутый синтаксис обучения, здесь бегло версия:
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()
Ответ 3
Эй, этот сайт может вам помочь:
101 Linq Samples
имеет примеры большинства функций linq, если и не выяснять, я могу писать для вас позже, если кто-то этого не делает.
Ответ 4
Я думаю, что у вас есть расхождение в предложении соединения - вы внутренне присоединяете счет-фактуру к себе на 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, что, вероятно, представляет особый интерес для вас.
Изменить: Заявление об использовании гораздо ближе к тому, что вы просили, чем мое. Я не наткнулся на группировку столбцов в примерах, с которыми я работал.