2016-11-16 2 views
0

Я провел последние два часа, изучая это. Является новым для LINQ кстати. Как мне получить такой SQL запрос LINQ?Простой подсчет SQL для LINQ?

SELECT  r.id, name, designation, COUNT(a.id) 
FROM  region r 
LEFT JOIN area a on a.region_id = r.id 
GROUP BY r.id, name, designation 

Моя альтернатива, конечно, чтобы поместить это в View (который я могу понять), но я хотел бы, чтобы это было добавлено к моему знанию. Благодаря!

P.S. Либо VB, либо C#, но я бы предпочел первый.

+2

У вас есть предложение группы в вашем SQL? В противном случае ваш COUNT не имеет смысла. – Sefe

+1

SQL неверен, так как вам нужно группировать 'r.id',' name' и 'обозначение' –

+0

О, sheesh, мой плохой. Исправлено, и спасибо, что указали это. :) – AwonDanag

ответ

1

Я думаю, что это будет так:

var result = 
      from r in regions 
      join a in areas on r.id equals a.region_id into subvalues 
      select new { id = r.id, name = r.name, designation = r.designation, count = subvalues.Count() }; 
+0

Является ли это Inner Join или Left Join? –

+0

Это левое соединение. – kiwiyou

+0

Затем как внутреннее соединение выполняется в том же запросе формата sql? –

0

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

var countQry = 
    from region in Regions 
    let areas = 
     from area in Areas 
     where area.RegionId == region.Id 
     select area 
    select new { 
     region.Id, 
     region.Name, 
     region.Designation, 
     AreaCount = areas.Count() 
    }; 
0

Ниже приводится 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() _ 
}) 
0

Нечто подобное может также работать правильно ..

int count = 0; 

(from r in region 
join a in area on r.<join_val> equals a.<join_val> into leftJ 
from lj in leftJ.DefaultIfEmpty() 
select lj 
).GroupBy(r => r.id).All(item => 
{ 
count += item.Count(); 
return true; 
}); 

счет должен иметь значение u, которое необходимо найти,

Смежные вопросы