C# 根据日期为项目添加功能

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

我有一个带有“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
}
我怎样才能使显示的任何事件在一整天都是相同的

编辑-我会尽量让它更有意义

我将事件设置为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

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

如果在给定的一天内可能有多个功能事件,您可以通过以下两种方式之一来完成

  • 选择任意项,并将其引用保存到某个位置,以便可以重用它,或者

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

  • 例如,假设有一个属性
    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我已经补充了一些想法来回应你修正后的问题。如果你愿意,请告诉我