1

キーでグループ化する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パラメータとして渡されるlongのリストです。すべてのCountSomeByteNには赤の下線が引かれています。グループのキーがオブジェクトモデルにマップされているグループ化された要素のカウントをどのように行いますか?

あなたの提案をありがとう。

4

2 に答える 2

1

selectグループの各要素を取得し、それらを同一の新しく作成された に投影してMyCountModelいますが、そのうちの 1 つだけを使用しています。これが私がそれを行う方法です:

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];
}

編集: 1 つのステートメントでそれを行う 1 つの方法を次に示します。Into基本的にx.Into(f)==として機能する という拡張メソッドを使用しf(x)ます。Selectこのコンテキストでは、メンバーではなく、列挙可能な全体に対して機能する のように見なすことができます。この種の状況で一時変数を削除するのに便利だと思います。これを 1 つのステートメントで記述するとしたら、おそらく次のようになります。

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];
    });
于 2012-09-28T19:46:48.583 に答える
1

サブクエリで範囲変数が正しくありません:

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

メソッド表記では、追加の選択は必要ありません。

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

とにかく使いたい場合:

CountSomeByte6 = TheCount.Where(theCount => theCount.Key == 6).Select(theCount => theCount).Count(), 
于 2012-09-28T16:58:10.197 に答える