【问题标题】:LINQ to SQL Get Latest Date from ObjectLINQ to SQL 从对象获取最新日期
【发布时间】:2013-07-18 06:22:08
【问题描述】:

我已经阅读了这方面的一些内容,包括How to select only the records with the highest date in LINQ,但我不知道如何将它应用到我稍微复杂的案例中。

我试图获取所有AdjusterProfileStatusItem,但只选择最近的s.statusDate。目前,查询只返回所有记录的所有日期;而我只想要所有记录的最近日期。

(from u in db.Users
join a in db.Adjusters
on u.id equals a.userID
join s in db.AdminAdjusterStatus
on a.id equals s.adjusterID
where u.userType.ToLower() == "adjuster"
&& s.status.ToLower() == "approved"

&& s.statusDate.Max() // causes syntax error...

select new AdjusterProfileStatusItem
{
   user = u,
   adjuster = a
})

编辑:

我也试过这个,它给了我一个语法错误......

(from u in db.Users
join a in db.Adjusters
on u.id equals a.userID
join s in db.AdminAdjusterStatus
on a.id equals s.adjusterID
where u.userType.ToLower() == "adjuster"
&& s.status.ToLower() == "approved"
group new { u, a, s } by s.adjusterID into x
select new AdjusterProfileStatusItem
{
    user = u, // u does not exist in context
    adjuster = a, // a does not exist in context
    status = x.Max(y => y.statusDate) // anonymous type does not contain definition for 'statusDate'
})

【问题讨论】:

  • 你可以使用 order by s.statusDate,并使用 take(n) 取一个两个或任意数量的你想要的。
  • @VladimirBozic 我想采用这种简单的方法,但我认为这只需要 1 条记录,而我想获取所有记录(按日期分组并且只获取最新的 s.statusDate 日期) .
  • 我正在尝试做这样的事情,但我不知道如何应用它stackoverflow.com/questions/15367615/…

标签: c# asp.net-mvc-4 linq-to-sql


【解决方案1】:

我不确定您对 Lambda 表达式的感受,但我可能会这样做:

db.Users
  .Join(db.Adjusters,
  u => u.Id,
  a => a.UserId,
  (u, a) => new 
  {
       User = u,
       Adjuster = a
  })
  .Join(db.AdminAdjusterStatus,
  a => a.Adjuster.Id,
  s => s.AdjusterId,
  (a, s) => new 
  {
       User = a.User,
       Adjuster = a.Adjuster,
       AdminAdjusterStatus = s
  })
  .Where(x => x.User.userType == "adjuster"
      && x.AdminAdjusterStatus.status == "approved"
      && x.AdminAdjusterStatus.statusDate == db.AdminAdjusterStatus
                             .Where(y => y.AdjusterId == 
                                    x.AdminAdjusterStatus.AdjusterId)
                             .Max(z => z.statusDate))
  .Select(a => new AdjusterProfileStatusItem
  {
      user = a.User
      adjuster = a.Adjuster
  })

**EDIT!!!**


(from u in db.Users
join a in db.Adjusters
on u.id equals a.userID
join s in db.AdminAdjusterStatus
on a.id equals s.adjusterID
where u.userType.ToLower() == "adjuster"
&& s.status.ToLower() == "approved"

&& s.statusDate == GetMaxStatusDate(db.AdminAdjusterStatus.ToList(), s.AdjusterID)

select new AdjusterProfileStatusItem
{
   user = u,
   adjuster = a
})

private DateTime GetMaxStatusDate(List<AdminAdjusterStatus> statuses, int adjusterId)
{
     return (from a in statuses
             where a.AdjusterId == adjusterId
             group a by a.AdjusterId into values
             select values.Max(x => x.statusDate)).FirstOrDefault();
}



 OR 



(from u in db.Users
join a in db.Adjusters
on u.id equals a.userID
join s in db.AdminAdjusterStatus
on a.id equals s.adjusterID
where u.userType.ToLower() == "adjuster"
&& s.status.ToLower() == "approved"

&& s.statusDate == db.AdminAdjusterStatus
                   .Where(x => x.AdjusterId == s.AdjusterId)
                   .Select(y => y.statusDate)
                   .Max();

select new AdjusterProfileStatusItem
{
   user = u,
   adjuster = a
})

【讨论】:

  • 这可能有效,但我希望为此找到一个 LINQ 查询。对于这样的事情,Lambda 有点冗长,但谢谢。如果没有其他人可以将这个或类似的东西翻译成 LINQ,我会接受这个。
  • 感谢您的反馈。如果成功,我将尝试严格的 LINQ 答案并将其作为另一个答案发布。
  • 我所做的编辑是我能想到的最好的 LINQ 答案。我希望它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多