「クエリでのエンティティタイプの明示的な構築は許可されていません」というエラーに関するいくつかの質問と、それを回避するためのさまざまな方法を読みました。
- クエリでのエンティティタイプ'###'の明示的な構築は許可されていません。
- クエリでのエンティティタイプ[MyClass]の明示的な構築は許可されていません
- クエリでのエンティティタイプ''の明示的な構築は許可されていません
コードでDBMLの自動生成されたLINQtoSQLクラスを使用しているので、データを適切に選択して挿入できると便利です。これは別の投稿で提案されている1つのアプローチです。次の例では、e_activeSessionは、DataContext内のテーブルの自動生成された表現です。
var statistics =
from record in startTimes
group record by record.startTime into g
select new e_activeSession
{
workerId = wcopy,
startTime = g.Key.GetValueOrDefault(),
totalTasks = g.Count(),
totalTime = g.Max(o => o.record.timeInSession).GetValueOrDefault(),
minDwell = g.Min(o => o.record.dwellTime).GetValueOrDefault(),
maxDwell = g.Max(o => o.record.dwellTime).GetValueOrDefault(),
avgDwell = g.Average(o => o.record.dwellTime).GetValueOrDefault(),
stdevDwell = g.Select(o => Convert.ToDouble(o.record.dwellTime)).StdDev(),
total80 = g.Sum(o => Convert.ToInt16(o.record.correct80) + Convert.ToInt16(o.record.wrong80)),
correct80 = g.Sum(o => Convert.ToInt16(o.record.correct80)),
percent80 = Convert.ToDouble(g.Sum(o => Convert.ToInt16(o.record.correct80))) /
g.Sum(o => Convert.ToInt16(o.record.correct80) + Convert.ToInt16(o.record.wrong80))
};
上記はエラーをスローするので、私は次のことを試みました:
var groups =
from record in startTimes
group record by record.startTime
into g
select g;
var statistics = groups.ToList().Select(
g => new e_activeSession
{
workerId = wcopy,
startTime = g.Key.GetValueOrDefault(),
totalTasks = g.Count(),
totalTime = g.Max(o => o.record.timeInSession).GetValueOrDefault(),
minDwell = g.Min(o => o.record.dwellTime).GetValueOrDefault(),
maxDwell = g.Max(o => o.record.dwellTime).GetValueOrDefault(),
avgDwell = g.Average(o => o.record.dwellTime).GetValueOrDefault(),
stdevDwell = g.Select(o => Convert.ToDouble(o.record.dwellTime)).StdDev(),
total80 = g.Sum(o => Convert.ToInt16(o.record.correct80) + Convert.ToInt16(o.record.wrong80)),
correct80 = g.Sum(o => Convert.ToInt16(o.record.correct80)),
percent80 = Convert.ToDouble(g.Sum(o => Convert.ToInt16(o.record.correct80))) /
g.Sum(o => Convert.ToInt16(o.record.correct80) + Convert.ToInt16(o.record.wrong80))
});
ただし、これToList
は非常に非効率的であり、コードを長時間そこに置いておくだけです。これを行うためのより良い方法はありますか?