LINQ表达式用于获取具有唯一父级的子记录

时间:2014-04-24 22:00:14

标签: c# sql linq

这是我的域名的简化版本:

class Document
{
    int id {get;set;}
    string name {get;set;}
    List<Version> Version {get;set;}
}

class Version
{
    int id {get;set;}
    string name {get;set;}
    List<VersionActivity> VersionActivity {get;set;}
    [ForeignKey]
    int DocumentID {get;set;}
}

class VersionActivity
{
    int id {get;set;}
    DateTime DateOfActivity {get;set;}
    string ActivityName {get;set;}
    [ForeignKey]
    int VersionID {get;set;}
}

查找返回最新20个版本的LINQ查询,但不能存在重复文档。

示例:

  • 我有3个文件,ID为1,2和3。
  • 我昨天编辑了文件1的第10版,第20版和第30版(即有活动)
  • 今天我编辑了文档2的版本40,50和60(因此这些文档版本位于最近编辑的文档列表之上)。
  • 查询需要仅返回文档2中的最新文档版本作为记录1,然后返回文档1的最新文档版本作为记录2.

我只想要一次往返数据库。如果使用SQL更容易,我可以使用它,尽管我更喜欢LINQ查询。

感谢。

2 个答案:

答案 0 :(得分:0)

我认为您可以将问题更改为“按更新日期的后续顺序列出前20个文档”。这是查询

from d in documents
let latestVersion = (from v in d.Version
                    let latestDate = v.VersionActivity.OrderByDescending (va => va.DateTime).Select(va => va.DateOfActivity).First()
                    orderby latestDate descending 
                    select {Version = v, LatestDate = latestDate}).First()
select new {Document = d, Version = latestVersion};

或者,如果每个文档的所有版本号都是增量的,只需查询

即可
from d in document
let latestVersion = d.Version.OrderByDescending(v => v.Id).First()
select new {Document = d, Version = latestVersion};

答案 1 :(得分:0)

//GET parent IDS  
var hiringStageIds = dbContext.JobRequisitionHiringStageSubStageLink.
                 Where(x => x.RequisitionTemplateID == RequisitionTemplatedId).Select(f =>
                 f.HiringStageID
            ).Distinct().ToList();


  var workflowIds = dbContext.JobRequisitionHiringStageSubStageLink.Where(d => hiringStageIds.Contains(d.HiringStageID)).Select(f => new
                { f.HiringStageID,
                    child =new { childs=                    dbContext.JobRequisitionHiringStageSubStageLink.Where(m=>m.HiringStageID==f.HiringStageID).Select(s=>s.HiringStagesWorkflowID).ToList()
                }
                }).GroupBy(x => x.HiringStageID).Select(y => y.First());