22

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

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時間グーグルした後、私は迷子になります。手伝っていただけませんか?

前もって感謝します

4

2 に答える 2

56

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

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

これを試して:

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() }
于 2013-10-10T01:11:07.703 に答える