根据日期显示项目

时间:2012-03-20 16:02:09

标签: c# .net linq

我有一个带有'featureEvent'布尔列的事件表。

我需要在主页上显示当天的精选活动

id喜欢做的是显示整天的特色活动。为此,我想我需要以某种方式将它与日期联系起来。

public Event GetTodaysFeatureEvent()
{
    var ev = db.Events.Where(x => x.featureEvent == true && x.eventDate> DateTime.Now.Date);
    //gets a pool of feature-able events
}

我怎么能这样做,以便显示的任何事件在一整天都是相同的?

编辑 - 我会尝试更有意义。

我将事件设置为可显示的(featureEvent = true)。我想要做的就是从一系列可以发生的事件(将来会发生)中挑选出一个单一事件。

我不想使用firstOrDefault,因为这可能会连续N天显示相同的事件。理想情况下,我喜欢每天从特色事件中选择不同事件的东西...我不能选择一个随机的事件,因为在同一天会有不同的事件和不同的用户。所以我希望整个一天向所有用户显示一个事件。

我不介意不止一次地展示相同的事件,即如果所有可成功的事件都已经被展示,那么回到第一个?

现在它变得更加复杂,因为我可以随时设置一个事件,所以不知道如何处理这方面的事情。

希望有点清楚......可能不会!

4 个答案:

答案 0 :(得分:2)

(这个答案假定eventDate的时间成分总是为零 - 换句话说,该值总是类似12/31/2012 00:00:00.000,而不是12/31/2012 11:30:00.000。)

请注意,您的逻辑仅选择之后发生的事件。要选择今天或更晚发生的事件,请将>更改为>=。要选择仅今天发生的事件,请使用==

如果某一天可能有多个功能事件,您可以通过以下两种方式之一完成此操作

  1. 选择一个任意项目,并在某处保存对它的引用,以便您可以重复使用它,或者

  2. 对您的linq查询应用一些明确的排序,以保证对象始终具有相同的顺序;然后选择第一个。

  3. 例如,假设有一个属性P,其值对每个事件都是唯一的,并且其类型为T,其中T实现IComparable<T>,那么您可以这样做:

    public Event GetTodaysFeatureEvent() 
    { 
        var ev = db.Events.Where(x => x.featureEvent && x.EventDate >= DateTime.Now.Date)
            .OrderByDescending(x => x.EventDate)
            .ThenBy(x => x.P)
            .FirstOrDefault();
    } 
    

    这将选择在第二天发生的至少一个事件的未来事件。由于事件按P排序,P假定为唯一,因此事件将始终以相同的顺序检索。

    如果您希望仅在实际日期显示精选活动(并且在没有精选活动的日期不显示任何内容),请将>=更改为==

    public Event GetTodaysFeatureEvent() 
    { 
        var ev = db.Events.Where(x => x.featureEvent && x.EventDate == DateTime.Now.Date)
            .OrderByDescending(x => x.EventDate)
            .ThenBy(x => x.P)
            .FirstOrDefault();
    } 
    

    回复您的修改:

      

    理想情况下,我喜欢每天从特色事件中选择不同事件的东西...我不能选择随机的事件,因为在同一天会有不同的事件和不同的用户。所以我希望整个一天向所有用户显示一个事件。

    要实现这一目标,您肯定需要有关某一天特定事件的持久信息。现在看来你的问题更多的是关于如何做到这一点而不是特定的linq表达式。

      

    我不介意不止一次地展示相同的事件,即如果所有可成功的事件都已经被展示,那么回到第一个?

    如果您想确保在所有其他活动都没有特色之前重复播放活动,您可以为每个特色活动保存“lastFeaturedOn”日期。在选择要特征的事件时,首先选择一个从未显示过的事件(即lastFeaturedOn == null);如果没有这样的事件,请选择lastFaturedOn日期最小的事件。

    这将以相同的重复顺序为您提供事件;如果你想改组它们,你可以将所有日期设置为null,当它们都是非空(或使用布尔值)时。

    选择活动后,您需要将其保存并在数据库中添加日期,以将其标识为该日期的特色活动。您可以使用“lastFeaturedOn”日期,并将“今天的特色项目”定义为“lastFeaturedOn日期为今天日期的项目。”

答案 1 :(得分:0)

如果我理解你:...

如果你只想要一整天

  public Event GetTodaysFeatureEvent()
    {
        var now = DateTime.Now;
        var ev = db.Events.Where(x => x.featureEvent == true && x.eventDate> new DateTime(now.year,now.month,now.day) && x.eventDate< new DateTime(now.year,now.month,now.day).AddDays(1));
        //gets a pool of feature-able events
    }

答案 2 :(得分:0)

你可以尝试

return ev.OrderBy(x => x.eventDate).FirstOrDefault();

如果您只想显示当天最早的,或者可以通过任何其他财产订购。

答案 3 :(得分:0)

我不确定你的答案究竟是什么,但如果你不知道如何获得今天的所有活动,这可能会有所帮助:

db.Events.Where(x => x.featureEvent == true 
                  && x.eventDate >= DateTime.Today
                  && x.eventDate <  DateTime.Today.AddDays(1).Date
               );

http://msdn.microsoft.com/en-us/library/system.datetime.today.aspx