LINQ Groupby查询单个列

时间:2014-10-21 09:48:53

标签: c# linq

我遇到的情况是我有一个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(),但那也没有用。以下示例数据。

Sample data

由于

我认为问题在于我有多个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。

3 个答案:

答案 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();