将带连接的SQL转换为LINQ时出错

时间:2016-09-22 18:07:16

标签: c# sql linq linq-to-sql linq-to-entities

我有一个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解决后弄明白。

对这里的错误有什么想法?我甚至不确定错误告诉我的是什么。

感谢所有帮助!

1 个答案:

答案 0 :(得分: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,您可以使用标准字符串比较。

这个可怕的错误很可能是由于使用无聊的对象进行分组和比较造成的,你我不愿意过多地阅读这个错误,因为这似乎是一种难以理解的恶魔,也不仅仅是凡人所能理解的。似乎。