web-dev-qa-db-ja.com

グループ化、カウントおよびラムダ式

次のクエリを翻訳しようとしています。

SELECT STATE, COUNT(*)
FROM MYTABLE
GROUP BY STATE;

ラムダ式に。私はC#とEntityFrameworkを使用していますが、機能させることができないようです。ここに私が今までリポジトリに持っているものがあります:

public IEnumerable<object> PorcentajeState(Guid id)
{
    return _context.Sates.Where(a => a.Id == id)
                         .GroupBy(a => a.State)
                         .Select(n => new { n.StateId , n.Count() });
}

もちろんそれはコンパイルされず、2時間グーグルで探した後失われます。手伝っていただけませんか?

前もって感謝します

20
N8K8

ここには2つの問題があります。

  1. GroupBy の結果は、タイプIEnumerable<IGrouping<TKey, TSource>>IGrouping インターフェイスには、アクセスできるプロパティが1つだけあります。Keyは、GroupBy式で指定したキーであり、IEnumerable<T>そのため、結果に対して他のLinq操作を実行できます。
  2. プロパティまたはフィールド式から推測できない場合は、匿名型のプロパティ名を指定する必要があります。この場合、CountIGroupingを呼び出しているため、そのプロパティの名前を指定する必要があります。

これを試して:

public IEnumerable<object> PorcentajeState(Guid id)
{
    return _context.Sates.Where(a => a.Id == id)
                         .GroupBy(a => a.StateId)
                         .Select(g => new { g.Key, Count = g.Count() });
}

クエリ構文で同等のものは

public IEnumerable<object> PorcentajeState(Guid id)
{
    return from a in _context.Sates
           where a.Id == id
           group a by a.StateId into g
           select new { a.Key, Count = g.Count() };
}

どちらの場合でも、最初のプロパティの名前をStateIdではなくKeyにしたい場合は、それを

new { StateId = g.Key, Count = g.Count() }
48
p.s.w.g

これはいい

public IEnumerable<object> PorcentajeState(Guid id)
    {
        return _context.Sates.Where(a => a.Id == id)
                             .GroupBy(a => a.StateId)
                             .Select(g => new { g.Key, Count = g.Count() });
    }

しかし、これを試してください。

public IEnumerable<object> PorcentajeState(Guid id)
        {
            return _context.Sates.Where(a => a.Id == id)
                                 .GroupBy(a => a.StateId)
                                 .Select(g => new { g.Key.StateId, Count = g.Count() });
        }
3
Ahsan Qureshi