2016-09-22 18 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 = // ??? 
     }; 

2つの問題:

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が解決されたらそれを理解できるかもしれません。

ここで何が間違っていると思いますか?私は、エラーが私に言っていることを正確には確信していません。

すべてのご協力ありがとうございます。

答えて

1

SQLクエリとあなたのLINQのコードを見ているだけで、私はこのような何かを思い付いた:あなたは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() 
}; 

注意比較。

この恐ろしいエラーは、異種のオブジェクトを使用してグループ化して比較することによって発生する可能性が最も高いですが、私はそのエラーをあまりにも読まないほうが好ましいと思います。

+0

ありがとうございましたGasper、しかしそれは同じエラーを与えるようです。私はそれが(NumTestsフィールドと同様に)それを削除すると、クエリがうまく動作するので、それが結合に関連していることを知っています。私はあなたのクエリがLinqpadでうまく動作することを明確にする必要があります...多分私の生成されたモデルに何か問題があります。私は再建を試みます。 –

+0

それは変です。テーブルのクラスがどのように見えるかを質問に反映させることもできます。 – Gasper

+0

合意。私はデータベースからモデルを再構築しようとしており、質問を更新します。 –

関連する問題