【问题标题】:LINQ filter nullable datetime with matching params?LINQ过滤具有匹配参数的可空日期时间?
【发布时间】:2015-09-22 01:15:49
【问题描述】:

我需要按日期、月份和年份过滤我的可空日期时间。

我目前正在尝试通过使用字符串比较来做到这一点。我在 linq 的 where 语句中有这个:

DOB.ToString().StartsWith("2/25/19") || DOB == null

但它不起作用。我知道它是因为服务器不会像那样存储日期,但我不确定它是如何存储它的,以及如何检索它并进行比较。

我真的需要在数据库上发生这种情况。我无法在服务器中获取所有内容并进行过滤。

我只想让 linq 按日、月和年过滤日期

感谢任何帮助或指点。

【问题讨论】:

  • 您是否正在查找 2 月 25 日 20 世纪的所有 DOB 记录?还有其他方法可以实现这一点。您将如何在数据库端执行此操作?你在使用存储过程吗?
  • 您可能应该使用 DateTime 方法来比较这些值,而不是将其转换为字符串。 DateTime 上有一个属性 Date 可能会对您有所帮助...
  • 我想要的是能够写“2”并获得所有2月2日的DOB。或写 2/25 并获取所有日期为 25 月为 2 月的 DOB。
  • 当你说“写'2'”时,你的意思是写在你的代码或 UI 中?您可以为您的问题发布一些背景信息吗?可能是整个 LINQ 查询。
  • 这不会有太大帮助,但是在搜索 1 月时,您会遇到 10 月到 12 月月份的问题。让我认为必须找到更好的路径......

标签: c# linq datetime


【解决方案1】:

您可以尝试这样的事情(更新为包含可选的日期组件):

int? month = 2;
int? day = 25;
int? century = 19; // actual century minus one

// other LINQ here
.Where(x => x.DOB == null 
    || ((month == null || x.DOB.Month = month)
     && (day == null || x.DOB.Day = day)
     && (century == null || x.DOB.Year / 100 == century)));

【讨论】:

  • 这看起来不错,但如果我不指定年份怎么办?或者我没有指定年份和月份?,linq 语句会变大吗?
  • 我更新了答案以考虑可选的日期组件。
  • 我最终做了 (DOB.Value.Date.Month.ToString() + "/" + DOB.Value.Date.Day.ToString() + "/" + DOB.Value.Date .Year.ToString()).StartsWith("2/25/19") || DOB == null 但您的回答给了我所需的洞察力。非常感谢。
【解决方案2】:

试试这个:

context.Entities.Where(e => e.Date != null && e.Date.Day == 15)

您可以使用DateTime.DayDateTime.MonthDateTime.Year 和逻辑运算符&&|| 进行您认为合适的过滤。但是,您必须先检查 nullity,否则您可能会得到 NullExceptions

【讨论】:

  • 我需要空值和匹配项。
  • @luisluix 您可以将条件更改为e.Date == null || ...)。如果日期实际上是null,那将会短路
【解决方案3】:

如果要按日、月、年进行过滤,请使用以下示例代码:

    DateTime dateTime = DateTime.Now;
    Console.WriteLine(dateTime.Day);
    Console.WriteLine(dateTime.Month);
    Console.WriteLine(dateTime.Year);

您可以从DateTime 对象中获取这些值。然后,您可以对其应用过滤器。

看完评论,我明白了。

例如,您输入这样的字符串:

string search = "2/25/2015";

现在,你想提取字符串的值来执行过滤,对吧?只需这样做:

string[] values = search.Split('/');

那么,values 将是 [2, 25, 2015]。第一个元素是月,第二个是日,第三个是年,这取决于你如何定义格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多