Преобразование SQL в Linq с перекрестным соединением - PullRequest
0 голосов
/ 17 января 2011

Может кто-нибудь помочь, пожалуйста, преобразовать следующий sql в linq в c #?

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 

1 Ответ

2 голосов
/ 17 января 2011

Перекрестные объединения обычно представляются в виде кратных предложений from в выражении запроса или вызова SelectMany в синтаксисе метода расширения.

Итак, первая часть вашего запроса может быть:

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

Левые внешние объединения обычно представлены запросом "join ... into ...", возможно, так:

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() };

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

...