2015-09-09 31 views
1

我一直在寻找所有的stackoverflow.com和Interwebz找出如何使用Linq Distinct(),但我没有任何运气与我的情况。Linq声明截然不同日期

我想要做的是显示日期列表(2015年8月,2015年7月等),每个日期只显示一次。

会发生什么情况是月份重复,因为您可以在一个月内多次发布新博客文章。我认为使用Distinct会有所帮助,但它似乎没有做任何事情。当我尝试添加GroupBy()时,我的OrderByDescending停止工作,并且我没有足够的经验来简单地将它变成IList,我在其他示例中看到过。

BlogRepeater.DataSource = _PostRepository.GetAll(ConfigurationManager.GetSiteID()) 
    .Where(x => x.DatePublished != null && x.DatePublished >= DateTime.Now.AddYears(-1)) 
    .Distinct().OrderByDescending(x => x.DatePublished) 
    .Select(x => x.DatePublished.Value.Date); 

这样做的最好方法是什么?

我试过从其他例子中取出一些零件,无济于事。提前致谢。

enter image description here

更新:感谢您的帮助!这是工作代码,希望它可以在未来帮助其他人。

代码背后:

BlogRepeater.DataSource = 
      _PostRepository 
      .GetAll(ConfigurationManager.GetSiteID()) 
      .Where(x => x.DatePublished != null && x.DatePublished >= DateTime.Now.AddYears(-1) && x.Status == "Published") 
      .Select(x => x.DatePublished.Value.ToString("MMM yyyy")) 
      .Distinct() 
      .OrderBy(x => x); 
     BlogRepeater.DataBind(); 

前端:

<a href="/Blog/Archive/<%#(Container.DataItem)%>"><%#(Container.DataItem)%></a> 

回答

6

如果您DatePublished字段包含不同的时间DateTime值,该.Distinct()不会表现你是如何想到的,因为这些值本质上不同。

如果你想不同的日期,而不是日期/时间,那么你可以在.Distinct()前移到最后.Select

BlogRepeater.DataSource = 
    _PostRepository 
    .GetAll(ConfigurationManager.GetSiteID()) 
    .Where(x => x.DatePublished != null && x.DatePublished >= DateTime.Now.AddYears(-1)) 
    .Select(x => x.DatePublished.Value.Date) 
    .Distinct() 
    .OrderByDescending(x => x); 

如果你想找到不同的月份,而不是日期,那么你必须将

.Select(x => x.DatePublished.Value.Date) 

线改为

.Select(x => x.DatePublished.Value.ToString("MMM yyyy")) 

随意将"MMM yyyy"格式更改为您认为合适的任何其他格式。

+0

看起来很简单,但是当我这样做时,代码会忘记DatePublished是什么。 'System.DateTime'不包含'DatePublished'的定义,并且没有找到接受'System.DateTime'类型的第一个参数的扩展方法'DatePublished'。它只是让我使用OrderByDescending作为查询的第一部分之一。 – jlg

+1

@jlg是的,对不起,我忘记了相应地更新'OrderByDescending'子句。查看我的答案更新。 – GolfWolf

+0

感谢您的清理!查询能够运行,但“Distinct()”仍然不起作用。检查我添加到帖子中的图像。 – jlg