2012-09-28 35 views
1

我正在尋找填充一個對象模型與一個linq-to-sql查詢的計數,它由它的密鑰分組。linq-to-sql與計數和自定義對象模型組

對象模型看起來有點像這樣:

public class MyCountModel() 
{ 
    int CountSomeByte1 { get; set; } 
    int CountSomeByte2 { get; set; } 
    int CountSomeByte3 { get; set; } 
    int CountSomeByte4 { get; set; } 
    int CountSomeByte5 { get; set; } 
    int CountSomeByte6 { get; set; } 
} 

這是我對查詢:

var TheQuery = from x in MyDC.TheTable 
       where ListOfRecordIDs.Contains(x.RecordID) && x.SomeByte < 7 
       group x by x.SomeByte into TheCount 
       select new MyCountModel() 
       { 
        CountSomeByte1 = TheCount.Where(TheCount => TheCount.Key == 1) 
              .Select(TheCount).Count(), 

        CountSomeByte2 = TheCount.Where(TheCount => TheCount.Key == 2) 
              .Select(TheCount).Count(),  
        ..... 

        CountSomeByte6 = TheCount.Where(TheCount => TheCount.Key == 6) 
              .Select(TheCount).Count(), 

       }.Single(); 

ListOfRecordIDs是則傳遞作爲參數多頭的名單。所有CountSomeByteN都以紅色下劃線。你如何計算分組元素的密鑰映射到對象模型?

感謝您的建議。

回答

1

select將您的組的每個元素都投射到相同的新創建了MyCountModel s,而你只使用其中的一個。下面是我該怎麼做:

var dict = MyDC.TheTable 
    .Where(x => ListOfRecordIDs.Contains(x.RecordID) && x.SomeByte < 7) 
    .GroupBy(x => x.SomeByte) 
    .ToDictionary(grp => grp.Key, grp => grp.Count()); 

var result = new MyCountModel() 
{ 
    CountSomeByte1 = dict[1]; 
    CountSomeByte2 = dict[2]; 
    CountSomeByte3 = dict[3]; 
    CountSomeByte4 = dict[4]; 
    CountSomeByte5 = dict[5]; 
    CountSomeByte6 = dict[6]; 
} 

編輯:這裏有一種方法在一個聲明中做到這一點。它使用名爲Into的擴展方法,其基本上可用作x.Into(f) == f(x)。在這種情況下,它可以被看作像Select,它在整個枚舉上而不是在其成員上起作用。我覺得它很方便用於消除這種情況臨時變量,如果我是在一個語句來寫這篇文章,它可能是我怎麼會做它:

public static U Into<T, U>(this T self, Func<T, U> func) 
{ 
    return func(self); 
} 

var result = MyDC.TheTable 
    .Where(x => ListOfRecordIDs.Contains(x.RecordID) && x.SomeByte < 7) 
    .GroupBy(x => x.SomeByte) 
    .ToDictionary(grp => grp.Key, grp => grp.Count()) 
    .Into(dict => new MyCountModel() 
    { 
     CountSomeByte1 = dict[1]; 
     CountSomeByte2 = dict[2]; 
     CountSomeByte3 = dict[3]; 
     CountSomeByte4 = dict[4]; 
     CountSomeByte5 = dict[5]; 
     CountSomeByte6 = dict[6]; 
    }); 
+0

我還需要一個orderby來確保CountSomeByte1 = dict [1];另外,有沒有辦法讓它在一個聲明中工作? – frenchie

+0

1)編號'dict'是'Dictionary','1'是字典鍵,而不是數組索引。 'dict [1]'將是'SomeByte'爲1的記錄的計數,因爲這就是分組完成的方式。 2)我確信有一種方法,但我懷疑它會一樣簡單。我會玩弄它。 –

+0

好的,謝謝;我認爲現在很好。 – frenchie

1

你的範圍變數是不正確的子查詢:如果你一定要使用它

CountSomeByte6 = TheCount.Where(theCount => theCount.Key == 6).Count(), 

 CountSomeByte6 = TheCount.Where(TheCount => TheCount.Key == 6) 
             .Select(TheCount).Count(), 

在方法的符號,你不需要額外的選擇

CountSomeByte6 = TheCount.Where(theCount => theCount.Key == 6).Select(theCount => theCount).Count(), 
+0

OK,語法錯誤,不要走開,但現在,在運行時,我得到一個「序列包含多個元素」的錯誤。 – frenchie

+0

您正在調用Single,這意味着您只需要一個元素,但顯然查詢會返回多個元素,就像消息所示。 – jeroenh

+0

是的,我打電話單,因爲我只尋找一個MyCountModel()返回。爲什麼它返回超過1? – frenchie