Linq从列表中获取最大版本的项目

时间:2017-07-12 13:10:41

标签: c# entity-framework linq

我在sql Server中有一个表:

CREATE TABLE AD_Users (
    [ImportID]          BIGINT           NOT NULL,
    [LogonID]           NVARCHAR (50)    NOT NULL,
    [EmployeeId]        NVARCHAR (64)    NULL,
    [FirstName]         NVARCHAR (64)    NULL,  
    [LastName]          NVARCHAR (64)    NULL,
 ......

每个loginId都有多个版本的数据,由ImportID键入。因此,要获取我使用的每个用户的最新信息:

SELECT LogonID,ImportID,EmployeeId, FirstName, LastName
   FROM AD_Users adUsers where ImportID =  (select Max(ImportID) from 
    AD_Users  a where a.LogonID = adUsers.LogonId);

现在我想用Linq做同样的事情。 EF将其映射到以下数据集:

public partial class ActiveDirectoryUser
{
    public long ImportID { get; set; }
    public string LogonId { get; set; }
    public long EmployeeId{ get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    .......

所以我需要做的就是从这个dbset获取具有该logonid的max importId的项目。

到目前为止,我有:

var latests = this.DbSet.GroupBy(g => g.SystemUniqueUserID) 

但是我不知道去那之后。是否可以在linq中执行我想要的操作,还是应该生成SQL?

不是How do I get the MAX row with a GROUP BY in LINQ query?的副本,因为这不会获得每个项目的最新版本。

2 个答案:

答案 0 :(得分:1)

您可以GroupBy LogonIdOrderByDescending ImportID并选择第一个,例如

    context.AD_Users.GroupBy(u=>u.LogonId).Select(g=>g.OrderByDescending(gg=>gg.ImportID)
.FirstOrDefault())

请检查语法,我刚刚醒来

答案 1 :(得分:0)

这是Tejas答案的一个变种。但是,这将为您提供已存在的对象,而不是创建新对象。

var latest =  (from x in context.AD_Users
              group x by x.LogonId into g
              select context.AD_Users.Where(u => u.LogonId == g.Key 
                     && u.ImportID == g.Max(uu => uu.ImportID)))
              .SelectMany(u => u);