2

次のようなクエリがあります。ID のリスト (ThelistOfIDs) をパラメーターとして取り、カウントをグループ化しています。

var TheCounter = (from l in MyDC.SomeTable
                  where ThelistOfIDs.Contains(l.ID)
                  group l by l.Status into groups
                  select new Counter()
                  {
                      CountOnes = (from g in groups
                                   where g.Status == 1
                                   select g).Count(),

                      CountTwos = (from g in groups
                                   where g.Status == 2
                                   select g).Count(),
                  }).Single();

基本的に、エラーが発生する理由がわかりません。DB から entore コレクションを戻したり、linq-to-object でカウントしたりしたくありません。DBでカウントして結果を戻したい。

4

3 に答える 3

1

ステータス別にグループ化し、そのグループから投影していますが、一意のステータスごとに 1 つの行があります (=== グループ)。

だから: 私はあなたが 1 つのユニークなステータスを持っていないことを提案します.

于 2012-04-08T14:38:50.577 に答える
0

これはあなたが探しているものかもしれません...
(これは私が持っていたユーザーテーブル用ですが、同じはずです)

var statuscounts = (from u in db.Users
                    where u.UserStatus > 0
                    group u by u.UserStatus into groups
                    select new { Status = groups.Key, Count = groups.Count() });

// do this to iterate and pump into a Counter at will
foreach (var g in statuscounts)
    Console.WriteLine("{0}, {1}", g.Status, g.Count);

...またはこのようなものでも...

var counter = statuscounts.AsEnumerable()
                    .Aggregate(new Counter(), (c, a) => {
                            switch (a.Status)
                            {
                                case 1: c.CountOfOnes = a.Count; return c;
                                case 2: c.CountOfTwos = a.Count; return c;
                                case 3: c.CountOfThrees = a.Count; return c;
                                default: c.CountOfOthers = a.Count; return c;
                            }});

...ポイントは、既にグループ化を行っている場合は、グループ化の結果を使用する必要があるということです。これIGrouping<out TKey, out TElement>は、キーがステータスでありIEnumerable<>、レコードであるタイプです。

お役に立てれば

于 2012-04-08T15:49:41.987 に答える