簡體   English   中英

將Join轉換為LINQ時出錯

[英]Error converting SQL with join to LINQ

我有一個SQL查詢,試圖將其轉換為LINQ,並且在枚舉查詢時難以理解晦澀的錯誤消息。

SQL查詢(按預期工作)是:

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,我得到以下信息:

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)枚舉查詢時,我遇到了運行時錯誤,無法解密。 該查詢在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)我不太確定如何將COUNT(DISTINCT a.Id)放入NumTests字段。 看起來LINQ不支持此功能,但似乎其他人已經問過這個問題,所以一旦解決#1,我也許就能弄清楚。

對這里出什么問題有任何想法嗎? 我什至不確定該錯誤告訴我什么。

感謝所有幫助!

僅查看SQL查詢和您的LINQ代碼,我想到了以下內容:

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()
};

注意,您不需要將LoadTestRunId轉換為int ,您可以只使用標准的字符串比較。

那個可怕的錯誤很可能是由使用一個不尋常的對象進行分組和比較引起的,您似乎不想過多地閱讀該錯誤,因為這似乎是一種臭名昭著的可憎之物,沒有人會看到或理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM