2010-12-20 25 views
0

根據起訴和預約號碼的複合關鍵字,我有divNssignments,它可能包含多行rNI,一個官方ID。Linq從數據對象中提取一個count()值

rNI Booking Indictment 
12345 954445 10 12345 
12345 954445 10 12346 
12345 954445 10 12347 

因此,對於此rni的單個預訂編號,ID的計數爲3。

我迷路試圖產生一個計數和一組被預訂號碼:

var moreThen = from dA in divAssignments 
    select new { dA.rNI, IndictmentCount = dA.indictmentNumber.Count() }; 

大多數例子是在處理靜態INT [],似乎沒有我的情況下工作。

我該如何得到一個組,然後計數?如果我可以投入一個非常棒的比賽。

從T-SQL POV我會使用這樣的:

Select rni, bookingNumber, count(*) IndictmentCount 
from divAssignments 
group by rni, bookingNumber 
having count(*) > 0 

TIA

回答

1

怎麼是這樣的:

var query = from item in divAssignments 
group item by item.rNI into grouping 
select new 
{ 
    Id = grouping.Key, 
    Count = grouping.Count() 
} 

如果你雙方感興趣的分組rNI和預訂號碼,我會將其更改爲:

var query = from item in divAssignements 
    group item by new { item.rNI, a.Booking } into grouping 
    select new 
    { 
     Id = grouping.Key, 
     Count = grouping.Count 
    }; 

OR

var query = from item in divAssignments 
    group item by item into grouping 
    select new 
    { 
     Id = grouping.Key, 
     Count = grouping.Count() 
    } 

和divAssignment對象上實現IEquatable支持相等比較。如果你願意,另一種選擇是編寫一個IEqualityComparer實例來執行組合鍵比較。然後,您的查詢可能看起來像:

var query = 
    divAssignments 
     .GroupBy(i => i, new MyCustomEqualityComparer()) 
     .Select(i => new { Key = i.Key, Count = i.Count()); 
+0

ooo,沒有看到複合關鍵部分。獲得答案。 – 2010-12-20 23:11:34

+0

你去了。 :) – 2010-12-20 23:21:17

0
var query = 
    from dA in divAssignments 
    group dA by new { dA.rNI, dA.bookingNumber }; 

foreach(var grp in query) 
{ 
    Console.WriteLine("rNI={0}, bookingNumber={1} => Count={2}", grp.Key.rNI, grp.Key.bookingNumber, grp.Count()); 
} 
0

如果您在LINQ的使用Grouping operator你會得到你所需要的。代碼:

var count = from a in divAssignments 
       group a by new { a.rNI, a.Booking } into b 
       select b; 

將返回IGrouping對象的集合。這將爲您提供密鑰(在我的示例中,這將是一個具有rNI和Booking屬性的匿名類型)以及與密鑰匹配的divAssignments的集合。

0

使用方法的語法(更容易在我看來閱讀):

第一組記錄,然後選擇包含計數每一組新的結果。

var groups = divAssignments.GroupBy(d => new { d.rNI, d.Booking }); 
groups.Select(g=> new { g.Key.rNI, g.Key.Booking, IndictmentCount = g.Count() });