使用linq / lambda选择最早的日期

时间:2014-10-01 17:30:57

标签: c# linq lambda

我有以下表达

 var list = techlinks.GetItems().Where(p =>  p.Status == 1).ToList();

我想更改此设置,以便我选择最早的日期值,例如

 var list = techlinks.GetItems().Where(p =>p.Date is earliest && p.Status == 1).ToList();

请告诉我要为p.Date插入最早的内容

谢谢

6 个答案:

答案 0 :(得分:17)

您可以使用OrderByOrderByDescending()按日期对其进行排序:

var list = techlinks.GetItems()
                    .Where(p => p.Status == 1)
                    .OrderBy(x=>x.Date).First(); // this will give oldest date

var list = techlinks.GetItems()
                    .Where(p => p.Status == 1)
                    .OrderByDescending(x=>x.Date).First(); // this will give latest date

答案 1 :(得分:3)

这是另一种方式。

var list=techlinks.GetItems()
                  .Where(p=>p.Status==1)
                    .Min(d => d.Date)
                      .Single();

答案 2 :(得分:2)

如果可能有多个项目都是最早的日期:

var list = techlinks.GetItems()
    .Where(p => p.Status == 1)
    .OrderBy(x=>x.Date)
    .GroupBy(x => x.Date)
    .First()
    .ToList()

答案 3 :(得分:0)

它稍微取决于GetItems() techLinks的作用,但类似的东西应该有效:

var list = techlinks.GetItems().Where(p => p.Date == techlinks.GetItems().Min(x => x.Date) && p.Status == 1).ToList();

如果GetItems()方法实际上访问了数据库,您可以先存储其结果并使用它两次:

var allItems = techLinks.GetItems();
var list = allItems.Where(p => p.Date == allItems.Min(x => x.Date) && p.Status == 1).ToList();

答案 4 :(得分:0)

如果你只想要1,你可以选择

techlinks.GetItems().Where(p => p.Status == 1).OrderBy(c => c.Date).FirstOrDefault();

否则我会把它分成两个陈述

var date = techlinks.Min(c=>c.Date);
techlinks.GetItems().Where(p => p.Status == 1 && c.Date == date).ToList();

还要注意你的日期是如何插入的,DateTime.Now会添加时间组件,所以可能需要做类似这样的事情

techlinks.GetItems().Where(p => p.Status == 1 && c.Date.Year == date.Year && c.Date.Month == date.Month && c.Date.Day == date.Day).ToList();

答案 5 :(得分:0)

Student student = _context.Set<Student>()
          .Where(p => p.StudentID == ID.Value)
          .OrderBy(p => p.AddedDate)
          .FirstOrDefault();