호출 스택이 없기 때문에 일부 LINQ를 SQL 코드로 디버깅하는 데 어려움을 겪고 있으며 오류가 발생한 위치를 알 수 없습니다. 그것은 SQL 오류가 아닌 것으로 보입니다. C#을 사용하지만 주위를 검색하면 오류를 제공하는 계산 방법을 찾을 수 없습니다.Visual Studio의 LINQ to SQL, 호출 스택이없는 InvalidCastException
소스 코드가 아래에 있으며 일부 새 행을 삽입하려고하면 오류가 표시됩니다. 호출 스택이 비어 있으며 예외에는 무엇이 잘못되었는지에 대한 정보가 없습니다.
var groups =
from record in startTimes
group record by record.startTime
into g
select new
{
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(),
correct80 = g.Sum(o => o.record.correct80.GetValueOrDefault() ? 1 : 0),
wrong80 = g.Sum(o => o.record.wrong80.GetValueOrDefault() ? 1 : 0)
};
var statistics = groups.AsEnumerable().Select(
g => new e_activeSession()
{
workerId = wcopy,
startTime = g.startTime,
totalTasks = g.totalTasks,
totalTime = g.totalTime,
minDwell = g.minDwell,
maxDwell = g.maxDwell,
avgDwell = g.avgDwell,
stdevDwell = g.stdevDwell,
total80 = g.correct80 + g.wrong80,
correct80 = g.correct80,
percent80 = g.correct80/(g.correct80 + g.wrong80)
}
);
// Put these rows into the table
_gzClasses.e_activeSessions.InsertAllOnSubmit(statistics);
_gzClasses.SubmitChanges();
다음은 예외 스택 추적입니다. 누군가가 그것을 해독 할 수 있다면 내가 어떻게 이러한 익명 형식을 읽는 단서가 없기 때문에,
at System.Data.SqlClient.SqlBuffer.get_Double()
at System.Data.SqlClient.SqlDataReader.GetDouble(Int32 i)
at Read_<>f__AnonymousType2`9(ObjectMaterializer`1)
at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at System.Data.Linq.Table`1.InsertAllOnSubmit[TSubEntity](IEnumerable`1 entities)
또한, 나는 LINQPad에서이 쿼리를 실행하고 동일한 오류 및 스택 추적을 가지고 ..., 말해주십시오. 마지막으로 LINQ to SQL에 의해 생성 된 데이터베이스 쿼리가 오류 바로 전에 실행되었습니다. 나는 이중 변환을 전혀 보지 못했다.
stdevDwell = g.Select(o => Convert.ToDouble(o.record.dwellTime)).StdDev(),
을 달기보십시오 :
SELECT COALESCE([t5].[value22],'1/1/0001 12:00:00 AM') AS [startTime], [t5].[value] AS [totalTasks], COALESCE([t5].[value2],0) AS [totalTime], COALESCE([t5].[value3],0) AS [minDwell], COALESCE([t5].[value4],0) AS [maxDwell], COALESCE([t5].[value5],0) AS [avgDwell], [t5].[value6] AS [correct80], [t5].[value7] AS [wrong80], [t5].[value22]
FROM (
SELECT COUNT(*) AS [value], MAX([t4].[timeInSession]) AS [value2], MIN([t4].[dwellTime]) AS [value3], MAX([t4].[dwellTime]) AS [value4], AVG([t4].[dwellTime]) AS [value5], SUM([t4].[value3]) AS [value6], SUM([t4].[value]) AS [value7], [t4].[value2] AS [value22]
FROM (
SELECT
(CASE
WHEN (COALESCE([t3].[wrong80],0)) = 1 THEN @p4
ELSE @p5
END) AS [value], [t3].[workerID], [t3].[value2], [t3].[timeInSession], [t3].[dwellTime], [t3].[value] AS [value3]
FROM (
SELECT
(CASE
WHEN (COALESCE([t2].[correct80],0)) = 1 THEN @p2
ELSE @p3
END) AS [value], [t2].[wrong80], [t2].[workerID], [t2].[value] AS [value2], [t2].[timeInSession], [t2].[dwellTime]
FROM (
SELECT (
SELECT MAX([t1].[timeStamp])
FROM [dbo].[workerLog] AS [t1]
WHERE ([t1].[dwellTime] IS NULL) AND ([t1].[timeInSession] = @p0) AND ([t1].[workerID] = @p1) AND ([t1].[timeStamp] <= [t0].[timeStamp])
) AS [value], [t0].[workerID], [t0].[dwellTime], [t0].[timeInSession], [t0].[correct80], [t0].[wrong80]
FROM [dbo].[workerLog] AS [t0]
) AS [t2]
) AS [t3]
) AS [t4]
WHERE [t4].[workerID] = @p6
GROUP BY [t4].[value2]
) AS [t5]
@pst 그것은 잘못보고하지 않습니다. 쿼리는 열거 될 때까지 연기됩니다. –