2012-04-29 101 views
1

我需要選擇結果集中的每個州和所有狀態列表的城市數。 我有TSQL查詢,但不知道如何處理LINQ中的內部查詢和分組。將TSQL查詢轉換爲LINQ

國表

StateID,StateName,Description,Address,SectionName 

城市表:

CityID,StateID,Address,Description 

下面是T-SQL查詢需要轉換到LINQ

declare @State varchar(100) 
set @State='IL' 

SELECT s.*,oCities.CityCount 
from ( 
     Select c.StateID,count(*) CityCount 
     from States s inner join Cities c on 
     s.StateID =c.StateID 
     where s.StateName [email protected] 
     group by c.StateID 
    ) oCities inner join States s on oCities.StateID = s.StateID 
where s.StateName [email protected] 

最好是在C#語言,但任何幫助將不勝感激

+0

[Stack Overflow不是代碼翻譯服務](http://meta.stackexchange.com/a/129362/172141) – 2012-04-29 08:24:19

+0

Oded,是的,我知道它不適合翻譯。我已經編寫了簡單的LINQ查詢來執行簡單的選擇,但遇到了這個查詢,因此決定尋求幫助。我很有經驗,但是還是LINQ的新手。 – Munawar 2012-04-29 08:48:24

回答

3

假設你的外鍵已經被定義,正確導入,然後這樣的事情應該工作

var state = states.Where (s => s.StateName == name).Select (
    s => new {State=s, CityCount=s.Cities.Count()}).SingleOrDefault(); 

使用LINQ to SQL中翻譯爲

SELECT [t2].*, [t2].[value] AS [CityCount] 
FROM (
    SELECT [t0].*, (
     SELECT COUNT(*) 
     FROM [City] AS [t1] 
     WHERE [t1].[StateId] = [t0].[Id] 
     ) AS [value] 
    FROM [State] AS [t0] 
    ) AS [t2] 
WHERE [t2].[StateName] = @p0 

其中P0爲您@state參數。

+0

第一個解決方案工作,但我不得不加入和重新導入表,因爲他們以前沒有加入,我也想要它。 -謝謝 – Munawar 2012-05-02 09:44:41

2
var q1 = 
from c in cities 
join s in states 
on c.StateID equals s.StateID 
where s.StateName=statename 
select new {city=c, state=s}; 

var result = q1.GroupBy(x=>x.state.StateID) 
       .Select(x=>new {Count = x.Count(), state = x.First().state}); 
+0

我得到了編譯時的錯誤:「s.StateID中的狀態的內連接s等於s.StateID」我刪除內部然後錯誤消失,但在運行時得到空引用異常:「對象引用未設置爲對象的實例「 – Munawar 2012-04-29 08:51:16

+0

@Needo,我在兩部分都寫了's',一部分應該是's',一部分應該是'c',用我的編輯。 – 2012-04-29 09:06:50

+0

是的,我已經注意到並糾正之前運行查詢,但仍然得到空引用異常。我是LINQ的新手,所以不知道它有什麼問題,但數據看起來是正確的,因爲TSQL查詢返回正確的數據。 – Munawar 2012-04-29 09:20:31