2011-01-17 2 views
0

Может кто-нибудь помочь в преобразовании следующего sql в linq в C#?Преобразование SQL в Linq с перекрестным соединением

select s.SYSTEM_NAME, 
     r.RESET_CODE, 
     COUNT(v.reset_code) 
    from (select distinct system_name 
      from tbl) s 
cross join (select distinct reset_code 
       from tbl) r 
left join tbl v on v.SYSTEM_NAME = s.SYSTEM_NAME 
       and v.RESET_CODE=r.RESET_CODE 
group by s.SYSTEM_NAME,r.RESET_CODE 

ответ

2

Перекрестные соединения, как правило, представлены в виде нескольких из положений в выражении запроса или вызова SelectMany в синтаксисе метода расширения.

Так первая часть запроса может быть:

var query = from systemName in db.Table.Select(x => x.SystemName).Distinct() 
      from resetCode in db.Table.Select(x => x.ResetCode).Distinct() 
      ... 

левый внешние соединения обычно представлены с запросом «присоединиться к ... в ...», возможно, как это:

var query = from systemName in db.Table.Select(x => x.SystemName).Distinct() 
      from resetCode in db.Table.Select(x => x.ResetCode).Distinct() 
      join tmp in db.Table on 
       new { ResetCode = resetCode, SystemName = systemName } 
       equals new { tmp.ResetCode, tmp.SystemName } 
       into tmpGroup 
      select new { ResetCode = resetCode, 
         SystemName = systemName, 
         Count = tmpGroup.Count() }; 

Я не уверен в части графа, если честно ... Я не уверен на 100%, что делает COUNT(v.ResetCode) в вашем исходном SQL.

+0

спасибо. Это решило мою проблему. Я добавил имя столбца в count(), чтобы иметь 0 для отсутствия кодов сброса. запрос linq корректно отображает результаты. Но будет ли кто-нибудь из группы иметь удар? просто любопытно узнать, какую роль он играет на самом деле. – Sasi

+0

@Sasi: Вы эффективно выполняете операцию «group by» с эффективностью «join ... in». Он использует оператор запроса GroupJoin LINQ. –