【问题标题】:Linq Get the maximum version of items from a listLinq 从列表中获取项目的最大版本
【发布时间】:2017-07-12 22:03:41
【问题描述】:

我在 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 的最大 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? 的重复项,因为它不会获取每个项目的最新版本。

【问题讨论】:

标签: c# entity-framework linq


【解决方案1】:

你可以 GroupBy LogonIdOrderByDescending ImportID 并选择第一个,类似

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

请检查语法,我刚醒来

【讨论】:

  • 这似乎是我所追求的——虽然你需要 FirstOrDefault() 而不是 First() 或者你得到一个异常(告诉你使用 FirstOrDefault!)谢谢
  • 您只需将FirstOrDefault 替换为.SelectMany(u => u)。这会给你想要的结果
【解决方案2】:

这是 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);

【讨论】:

  • 你在做额外的和不必要的Where条件
  • 你正在做GroupBy,这将为每个登录名隔离
  • 这看起来很像我在返回 IQueryable> 之后的那种东西,但我只需要一个简单的 IQueryable 吗?
  • @Lobsterpants 你是对的。没认出来。我已经更新了我的答案以纠正这个问题。
  • @AD.Net 是正确的。但是我看不到如何在没有位置的情况下选择最大对象。可以举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多