2016-07-06 54 views
0

我想爲我的儀表板中的某個儀表板編寫一個LINQ查詢,它根據某些條件檢索數據。我想根據表格中可用的不同狀態顯示記錄計數。LINQ虛擬(預定義)列分組

以下是我試圖轉換成Linq的SQL查詢。

select count(id) cnt, 'Available' label from table where date = sysdate 

以上查詢返回結果在DB IDE下面。這是我想要linq的結果

cnt label 
0  Available 

我試着用下面的linq查詢,但它返回0計數,因此結果沒有被檢索。

var data = (from a in context 
where a.date = System.DateTime.Now 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).ToList(); 

如何在linq中達到上述結果。您的幫助將不勝感激。

感謝

-------------編輯---------------- 更新LINQ查詢

var data = (from a in context.TableA 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).Concat(from a in context.TableB 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'WIP' 
}).ToList(); 
+1

您的SQL查詢中沒有where子句,但是在您的Linq中執行,並且我懷疑您的表日期列與當前的DateTime.Now(我可以保證它不是)相同。從你的linq中刪除'where'。 – Dispersia

+0

您想計算具有特定ID的數據中元素的數量,還是要統計數據中唯一ID的數量? –

+0

@Dispersia - 我已經更新了SQL查詢。請參閱更新的一個。儘管如此,它仍然在DB IDE中返回1行,但不會與linq一起返回。僅供參考,我需要這個條件來過濾結果。謝謝 – user968441

回答

2

要計算在LINQ查詢匹配謂詞元件的數量簡單地用where子句:

var results = 
    from a in context 
    where a.date.Date == DateTime.Now.Date 
     && a.id == someIdHere 
    select a; 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

或者,在擴展方法的語法(我喜歡):

var results = context.Where(a => a.date.Date == DateTime.Now.Date && a.id == someIdHere); 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

比較關於什麼樣的結果,你希望有一個DateTime對象時也要小心;將DateTime.Now與日期進行比較將會返回false,因爲它也會比較時間碼,所以使用DateTime.Date屬性僅爲了比較的目的從對象中獲取日期。

+0

感謝您的回覆。看看LINQ和lambda表達式,它應該像預期的那樣工作,但是我們不能把它放在單個查詢中。實際上,我在linq中使用了'Concat'擴展方法來獲得基於不同標籤的結果,因此我嘗試使用單個linq來計算基於不同標籤的記錄數。 – user968441

+0

這可能是可能的,但我會通過將所有內容強制爲一個查詢來避免複雜的事情;在我的經驗中,將所有內容放入大型報表的願望只會導致無法維護的代碼。如果它回答你的問題,請記住標記爲答案。 –

+0

是的,我知道它可能是一個複雜的LINQ,但不是有多個數據庫行程,我建議有一個單一的查詢,根據建議檢索整個數據,因此有這種方法。如果我們將聚合邏輯與LINQ結合起來,我不會同意「不可維護的代碼」。這取決於您正在嘗試管理的編寫linq和邏輯的方式。看到我用「Concat」聲明更新了我的問題。謝謝 – user968441