Ниже приводится C# версия кода:
var result = regions.GroupJoin(areas, r => r.Id, a => a.Id, (r, a) => new {r,a})
.SelectMany(x => x.a.DefaultIfEmpty(),
(x, y) => new { x.r.Id, x.r.Name, x.r.Designation, aId = (y == null) ? 0 : y.Id })
.GroupBy(x => new {x.Id, x.Name,x.Designation})
.Select(y => new {y.Key.Id, y.Key.Name, y.Key.Designation, Count = y.Count()});
Объяснение:
- В Linq
GroupJoin
представляют Left Join
i п Sql
- Вы Left вместе с
Regions
на левой стороне, так что он будет содержит все Regions
записи и записи по районам может быть пустым, для которых мы делаем это DefaultIfEmpty()
, который является нулевым
- SelectMany помогает нам сплющить данные, чтобы включить все результаты, где для Id зоны Заполняем 0, где запись является нулевым
- Тогда мы
GroupBy
с помощью Id,Name,Designation
, а четвертое поле, которое является идентификатор области только агрегированные
- Наконец использовать
Select
, чтобы получить окончательный результат в ожидаемый формат
VB версия коды с помощью этого converter
regions.GroupJoin(areas, Function(r) r.Id, Function(a) a.Id, Function(r, a) New From { _
r, _
a _
}).SelectMany(Function(x) x.a.DefaultIfEmpty(), Function(x, y) New With { _
x.r.Id, _
x.r.Name, _
x.r.Designation, _
Key .aId = If((y Is Nothing), 0, y.Id) _
}).GroupBy(Function(x) New From { _
x.Id, _
x.Name, _
x.Designation _
}).[Select](Function(y) New With { _
y.Key.Id, _
y.Key.Name, _
y.Key.Designation, _
Key .Count = y.Count() _
})
У вас есть предложение группы в вашем SQL? В противном случае ваш COUNT не имеет смысла. – Sefe
SQL неверен, так как вам нужно группировать 'r.id',' name' и 'обозначение' –
О, sheesh, мой плохой. Исправлено, и спасибо, что указали это. :) – AwonDanag