我遇到的情况是我有一个Job,它有多个以特定间隔运行的测试。作业运行生成一个唯一的TestRunId,它是一个GUID,用于引用多个结果,基本上使用唯一的RunId(GUID)对特定运行进行分组。
现在的问题是我需要选择已生成的唯一运行,但我的LINQ查询会选择每次运行。
我试过这样的事情
var testRunIds = ((from tests in context.testresults
where tests.JobId == jobId
select new
{
tests.TestRunId
}).GroupBy(t=>t.TestRunId).OrderBy(t=>t.Key).Skip((pagenum - 1) * pagesize).Take(pagesize)).ToList();
但正如我所说,此查询会获取每个testResult。不知道我现在怎么做。我尝试了Distinct(),但那也没有用。以下示例数据。
由于
我认为问题在于我有多个TestRunId值,因为它本质上是一个分组。为了达到我的需要,我尝试使用(使用Linqer)
from Queries in db.TestResult
where
Queries.JobId == 1
group Queries by new {
Queries.TestRunId,
Queries.StartTime,
Queries.EndTime
} into g
orderby
g.Key.TestRunId
select new {
_ID = (int?)g.Max(p => p.Id),
g.Key.TestRunId,
g.Key.StartTime,
g.Key.EndTime
}
但这仅适用于MSSQL数据源,基本上是
SELECT max(id)[ ID],
TestRunId,
StartTime,
Endtime
FROM dbo.query where jobid = 1 group by TestRunId,StartTime,Endtime order by StartTime;
但我需要的是
SELECT TestRunId,StartTime,Endtime FROM testresult where jobid = 1 group by TestRunId order by StartTime;
for MySQL。
答案 0 :(得分:2)
试试这个: -
var jobs = context.testresults;
var query2 = jobs.Where(x => x.TestID == 1).OrderBy(x => x.StartTime).Select(x => x.TestRunID).Distinct();
工作Fiddle。
答案 1 :(得分:1)
我认为你可能正在寻找这个:
var testRunIds = context.testresults.Where(t => t.JobId == jobId).OrderBy(t => t.starttime)
.Select(t => t.TestRunId).Distinct().Skip((pagenum - 1) * pagesize).Take(pagesize)
.ToList();
首先进行过滤和排序,然后选择所需的单个字段,然后使用Distinct()获取唯一性,然后根据需要跳过/取出。首先选择单个字段,然后尝试对表中的其他字段进行排序或过滤,这些字段不再是查询的一部分。
答案 2 :(得分:0)
感谢您帮助我。我设法分两步完成了这项工作。
var testRunIds = (from tests in context.testresults
where tests.JobId == jobId
select new
{
tests.TestRunId,
tests.StartTime
}).OrderBy(x => x.StartTime).Skip((pagenum - 1) * pagesize).Take(pagesize).GroupBy(x=>x.TestRunId).ToList();
var resultData = testRunIds.Select(testRunId => (context.testresults.Where(
items => items.TestRunId == testRunId.Key)).FirstOrDefault()).ToList();