C# 根据日期为项目添加功能
我有一个带有“featureEvent”布尔列的事件表 我需要在主页上显示当天的特色活动 我想做的是展示一整天的特色活动。为此,我想我需要以某种方式将它与日期联系起来C# 根据日期为项目添加功能,c#,.net,linq,C#,.net,Linq,我有一个带有“featureEvent”布尔列的事件表 我需要在主页上显示当天的特色活动 我想做的是展示一整天的特色活动。为此,我想我需要以某种方式将它与日期联系起来 public Event GetTodaysFeatureEvent() { var ev = db.Events.Where(x => x.featureEvent == true && x.eventDate> DateTime.Now.Date); //gets a pool of
public Event GetTodaysFeatureEvent()
{
var ev = db.Events.Where(x => x.featureEvent == true && x.eventDate> DateTime.Now.Date);
//gets a pool of feature-able events
}
我怎样才能使显示的任何事件在一整天都是相同的
编辑-我会尽量让它更有意义
我将事件设置为featureable(featureEvent=true)。我想做的是从一个特性事件池(将在未来发生)中选择一个事件
我不想使用firstOrDefault,因为这可能会连续N天显示相同的事件。理想情况下,我希望能从每天的特色活动中选择不同的活动。。。我不能随便挑一个,因为在同一天,不同的活动将被展示,针对不同的用户。因此,我希望一个事件能够全天显示给所有用户
我不介意一次又一次地介绍同一事件(如果所有的特色事件都已经介绍过了,那么就回到第一个
现在它变得更复杂了,因为我可以在任何时候设置一个活动,所以不知道如何处理这方面的事情
希望这更清楚一点……可能不会 如果我理解你: 如果你只想一整天
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
}
public Event GetTodaysFeatureEvent()
{
var now=DateTime.now;
var ev=db.Events.Where(x=>x.featureEvent==true&&x.eventDate>newdatetime(now.year,now.month,now.day)&&x.eventDate
您可以试试
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
);
db.Events.Where(x=>x.featureEvent==true
&&x.eventDate>=日期时间。今天
&&x.eventDate
(此答案假设eventDate
的时间分量始终为零——换句话说,该值始终类似于12/31/2012 00:00:00.000
,而不是12/31/2012 11:30:00.000
)
请注意,您的逻辑仅选择今天之后发生的事件。要选择今天或以后发生的事件,请将
更改为>=
。要选择仅今天发生的事件,请使用==
如果在给定的一天内可能有多个功能事件,您可以通过以下两种方式之一来完成
p
,其值对于每个事件都是唯一的,其类型为T
,其中T实现IComparable
,则可以执行以下操作:
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);如果没有此类事件,请选择日期上具有最小LastFeature的事件
这将为您提供相同重复顺序的事件;如果你想重新排列它们,你可以在所有日期都不为null时将它们设置为null(或者使用布尔值)
一旦你选择了一个事件,你需要将它和一个日期保存在你的数据库中,以确定它是该日期的特色事件。您可以使用“lastFeaturedOn”日期,并将“今天的特色项目”定义为“lastFeaturedOn日期为今天日期的项目。”x.eventDate的数据类型是什么?它是一个
DateTime
?@M.Babcock如果x.eventDate
有任何类型而不是DateTime
@phoog,我认为示例代码不会编译-您假设它编译+但是你的答案是1。这是对DateTime.Now.Date
的一个非常详细的替换。更重要的是,如果eventDate
值始终是一个没有时间成分的日期,那么您的查询将永远不会返回任何内容;在这种情况下,逻辑上类似于说,对于整数,其中v>x和v
@phoog是的,我不知道DateTime.Now.Date。现在我知道了。我已经修正了这个问题,希望它更有意义。@raklos我已经补充了一些想法来回应你修正后的问题。如果你愿意,请告诉我