2010-07-23 109 views
1

如何將以下轉化爲LINQ - EFLINQ HAVING子句內選擇

select Name 
from TableA as TableAOuter 
group by TableAOuter.Name, TableAOuter.Id 
having(
    select count(TableAInner.Id) 
    from TableA as TableAInner 
    where TAbleAInner.Reference=TableAOuter.Id) = 0 
); 

回答

2

對我來說,這看起來像:

var query = from row in tableOuter 
      group row by new { row.Name, row.Id } into g 
      where !tableInner.Any(inner => inner.Reference == g.Key.Id) 
      select g.Key.Name; 

雖然我會忍不住執行濾波在分組之前 - 此時您可以將行名稱分組:

var query = from row in tableOuter 
      where !tableInner.Any(row => inner.Reference == row.Id) 
      group row.Name by new { row.Name, row.Id }; 

I 認爲應該做同樣的事情吧?

+0

不應該是'!tableInner.Any(inner => inner.Reference == row.Id)'和'group row.Name by new'? – 2010-07-23 07:38:09

+0

謝謝,完全符合我上面評論的更改! – 2010-07-23 07:41:55

+0

哎呀 - 我的意思是「在兩種情況下排隊」。在第一個版本中,你不能在where子句中使用'row.Id',因爲它不在範圍內。修正了兩者並簡化了後一種方法。 – 2010-07-23 07:54:47