我有一个带有'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天显示相同的事件。理想情况下,我喜欢每天从特色事件中选择不同事件的东西...我不能选择一个随机的事件,因为在同一天会有不同的事件和不同的用户。所以我希望整个一天向所有用户显示一个事件。
我不介意不止一次地展示相同的事件,即如果所有可成功的事件都已经被展示,那么回到第一个?
现在它变得更加复杂,因为我可以随时设置一个事件,所以不知道如何处理这方面的事情。
希望有点清楚......可能不会!答案 0 :(得分:2)
(这个答案假定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);如果没有这样的事件,请选择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