根据日期对项目进行专题介绍
本文关键字:专题 项目 日期 | 更新日期: 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
。)
请注意,您的逻辑只选择今天之后发生的事件。要选择今天或以后发生的事件,请将>
更改为>=
。要选择今天发生的事件,请使用==
。
如果有可能在一天内有多个功能事件,您可以通过的两种方式之一来实现
-
选择一个任意项目,并将其引用保存在某个位置,这样您就可以重用它,或者
-
对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