次のクエリを翻訳しようとしています。
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時間グーグルで探した後失われます。手伝っていただけませんか?
前もって感謝します
ここには2つの問題があります。
GroupBy
の結果は、タイプIEnumerable<IGrouping<TKey, TSource>>
。 IGrouping
インターフェイスには、アクセスできるプロパティが1つだけあります。Key
は、GroupBy
式で指定したキーであり、IEnumerable<T>
そのため、結果に対して他のLinq操作を実行できます。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() }
これはいい
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() });
}