将带有join的SQL转换为LINQ错误

本文关键字:转换 LINQ 错误 SQL join | 更新日期: 2023-09-27 18:08:33

我有一个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)我不太确定如何获得计数(DISTINCT a.d id)进入NumTests字段。看起来LINQ中不支持这个,但看起来其他人已经问过这个问题了,所以我可能能够在#1解决后弄清楚它。

有什么想法吗?我甚至不确定这个错误到底告诉了我什么。

感谢所有的帮助!

将带有join的SQL转换为LINQ错误

查看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,您可以使用标准字符串比较。

这个可怕的错误很可能是由使用匿名对象进行分组和比较引起的,尽管我不喜欢过多地阅读这个错误,因为它似乎是一个令人讨厌的东西,不被凡人看到或理解。