我在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?的副本,因为这不会获得每个项目的最新版本。
答案 0 :(得分:1)
您可以GroupBy
LogonId
和OrderByDescending
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);