Агрегирование родительских / дочерних таблиц с использованием Linq to SQL и VB.net - PullRequest
0 голосов
/ 18 сентября 2009

У меня кошмар с LINQ.

У меня есть таблица Projects, и у каждого проекта есть много InvoiceHeaders. Заголовок Invoice имел поле AmountNet - значение счета.

Я хочу получить, ради аргумента, все поля из Projects, с количеством заголовков счетов и суммой AmountNet. То есть список моих проектов, сколько счетов я выставил и стоимость.

Звучит не сложно, да ... ну, я просто потратил большую часть двух часов, заряжаясь через Google и SO, чтобы найти решение. Мне удалось это:

from c in Projects _
select new with _
{ _
    .ID = c.ID, _
    .Invoices = InvoiceHeaders.Where(Function(p) c.ID = p.ProjectID).Count, _
    .InvoiceValue = InvoiceHeaders.Where(Function(p) c.ID = p.ProjectID).Sum(function(f) f.AmountNet) _
}

Те, у кого орлиные глаза, увидят, насколько УЖАСНЫ это утверждение - для каждого проекта выполняется два запроса для получения агрегатов. Eughk.

У меня тоже есть несколько агрегатов в Linq / vb:

from ih in InvoiceHeaders _
group ih by ih.projectid into g = Group  _
select new with { _
    .InvoiceValue = g.Sum(function(f) f.AmountNet), _
    .InvoiceCount = g.Count _
} _

Но с этим я не могу понять, как вернуть детали проекта. Esp, видящий как «Ключ», не работает в Vb.net.

Кстати - я использую VB.net:)

Есть идеи?

1 Ответ

0 голосов
/ 28 октября 2009

Моя попытка будет такой

from ih in InvoiceHeaders _
group ih by ih.projectid into g = Group  _
select new with {.pjs=(from p in projects where p.ID=ih.projectid select p), _
    .InvoiceValue = g.Sum(function(f) f.AmountNet), _
    .InvoiceCount = g.Count _
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...