根据日期对项目进行专题介绍

本文关键字:专题 项目 日期 | 更新日期: 2023-09-27 18:28:28

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

我需要在主页上显示当天的特色事件

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

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天显示相同的事件。理想情况下,我想从每天可参加的活动中选择不同的活动。。。我不能随便选一个,因为在同一天,不同的活动将为不同的用户提供特色。所以我希望一个事件能全天显示给所有用户。

我不介意不止一次地介绍同一个事件(如果所有可欣赏的事件都已经介绍过了,那就回到第一个吗?)?

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

希望能更清楚一点。。。。可能不会!

根据日期对项目进行专题介绍

(这个答案假设eventDate总是有一个零的时间分量——换句话说,这个值总是像12/31/2012 00:00:00.000,而不是像12/31/2012 11:30:00.000。)

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

如果有可能在一天内有多个功能事件,您可以通过的两种方式之一来实现

  1. 选择一个任意项目,并将其引用保存在某个位置,这样您就可以重用它,或者

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

例如,假设有一个属性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);如果没有此类事件,请选择最后FeaturedOn日期最小的事件。

这将为您提供相同重复顺序的事件;如果你想重新排列它们,你可以在它们都不是null的时候将所有日期设置为null(或者使用布尔值)。

一旦您选择了一个事件,您需要将其和日期保存在数据库中,以将其标识为该日期的特色事件。您可以使用"lastFeaturedOn"日期,并将"今天的特色项目"定义为"其lastFeaturedOn日期为今天日期的项目"。

如果我理解你:。。。

如果你只想全天

  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
    }

您可以尝试

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

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

我真的不确定你的答案是什么,但如果你不知道如何获取今天的所有事件,这可能会有所帮助:

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