2016-09-22 5 views
0

LINQ로 변환하려고하는 SQL 쿼리가 있는데 쿼리를 열거 할 때 애매한 오류 메시지를 이해하는 데 문제가 있습니다. (의도 한대로 작동)LINQ로 조인 된 SQL을 변환하는 중 오류가 발생했습니다.

SQL 쿼리는 것입니다 : 내가 가진

var q = from a in _context.LoadTestSummary 
     where 
      a.TargetStack == env && 
      a.TestGuid != null && 
      a.StartTime != null && 
      a.LoadTestRunId != null 
     join b in _context.LoadTestTestSummaryData on new 
     { 
      LoadTestRunId = Convert.ToInt32(a.LoadTestRunId) 
     } equals new 
     { 
      LoadTestRunId = b.LoadTestRunId 
     } 
     group new { a, b } by new 
     { 
      a.TestGuid 
     } 
     into g 
     select new 
     { 
      DateCreated = g.Min(p => p.a.StartTime), 
      NumScenarios = g.Count(), 
      TestGuid = g.Key.TestGuid 
      NumTests = // ??? 
     }; 

두 가지 문제 :

1)

select a.TestGuid, MIN(a.StartTime) as StartTime, COUNT(b.TestCaseId) as NumTests, COUNT(DINSTINCT a.Id) as NumScenarios 
from LoadTestSummary as a 
join LoadTestTestSummaryData as b 
    on a.LoadTestRunid = b.LoadTestRunId 
where 
    a.TargetStack = env and 
    a.TestGuid IS NOT NULL AND 
    a.StartTime IS NOT NULL AND 
    a.LoadTestRunId IS NOT NULL 
group by a.TestGuid 

나는 다음과 같은 얻을 LINQ로 변환 쿼리가 열거 될 때 런타임 오류가 발생하여 해독하는 데 문제가 있습니다. 쿼리 Linqpad 잘 작동하지만 내 프로그램에서 런타임 오류를 제공합니다. 나는 이것이 무엇을 일으키는 지 확신하지 못한다. 그냥이 쳐다 내 머리 상처 수 :

ArgumentException: Expression of type 'System.Func``2[Microsoft.Data.Entity.Query.EntityQueryModelVisitor+TransparentIdentifier``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData],<>f__AnonymousType7``1[System.String]]' cannot be used for parameter of type 'System.Func``2[<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData],<>f__AnonymousType7``1[System.String]]' of method 'System.Collections.Generic.IEnumerable``1[System.Linq.IGrouping``2[<>f__AnonymousType7``1[System.String],<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData]]] _GroupBy[<>f__AnonymousType5``2,<>f__AnonymousType7``1,<>f__AnonymousType5``2](System.Collections.Generic.IEnumerable``1[<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData]], System.Func``2[<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData],<>f__AnonymousType7``1[System.String]], System.Func``2[<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData],<>f__AnonymousType5``2[PerfPortal.Models.LoadTestSummary,PerfPortal.Models.LoadTestTestSummaryData]])'

2)가 NumTests 필드에 COUNT (DISTINCT a.Id을)하는 방법을 아주 확실하지 않다. 이것은 LINQ에서 지원되지 않는 것처럼 보이지만 # 1이 해결되면 다른 사람들이이 질문을 한 것처럼 보입니다.

여기에 무슨 문제가 있다고 생각하십니까? 나는 그 오류가 내게 무엇을 말하고 있는지조차 정확하게 알지 못한다.

모든 도움을 주실 수 있습니다! 방금 표준 문자열을 사용할 수 있습니다, intLoadTestRunId을 변환 할 필요가 없습니다,

from a in LoadTestSummary 
join b in LoadTestTestSummaryData 
    on a.LoadTestRunId equals b.LoadTestRunId 
where 
    a.TargetStack == env && 
    a.TestGuid != null && 
    a.StartTime != null && 
    a.LoadTestRunId != null 
group new { a, b } by a.TestGuid into g 
select new 
{ 
    TestGuid = g.Key, 
    DateCreated = g.Min(el => el.a.StartTime), 
    NumTests = g.Select(el => el.b.TestCaseId).Count(), 
    NumScenarios = g.Select(el => el.a.Id).Distinct().Count() 
}; 

참고 : SQL 쿼리와 LINQ 코드를 바로 찾고

답변

1

,이 같은 것을 함께했다 비교.

그 끔찍한 오류는 다른 개체를 사용하여 그룹화하고 비교할 때 가장 많이 발생합니다. 너는 그 오류를 너무 많이 읽지 않으려 고합니다. 필자는 단순한 필사자로 보거나 이해하지 못하는 것처럼 보입니다.

+0

감사합니다. Gasper,하지만 같은 오류가 발생하는 것 같습니다. 내가 그것을 (NumTests 필드뿐만 아니라) 그것을 제거하면 쿼리가 잘 작동하기 때문에 그것이 조인과 관련이있다. 나는 당신의 질의가 Linqpad에서 잘 작동한다는 것을 분명히해야한다. 그래서 아마도 내 생성 된 모델에 문제가있을 것이다. 나는 재건을 시도 할 것이다. –

+0

그건 이상합니다. 테이블의 클래스가 어떻게 보이는지에 대한 질문을 업데이트하려고 할 수도 있습니다. – Gasper

+0

동의. 데이터베이스에서 모델을 다시 작성하려고 시도하고 질문을 업데이트합니다. –