c# - 在 HQL 查询的 "where"子句中使用日期

标签 c# nhibernate

我正在使用 SQLite数据库并具有以下持久类(简化):

public class Project
{
    public virtual int Id { get; set; }
    public virtual DateTime StartDate { get; set; }
}

映射到数据库中的这个表:

CREATE TABLE projects (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    start_date DATETIME
)

现在我需要编写一个查询来选择在给定月份开始的所有项目。

在 SQL 中我可以使用:

SELECT id FROM projects WHERE strftime('%m', start_date) = '12'

我不喜欢这个查询的地方在于它使用了数据库特定的函数“strftime”。

所以下面的HQL依赖于底层数据库:

// Get all projects that started in December (no matter which year)
var projects = session
    .CreateQuery(
        "from Project p " +
        "where strftime('%m', p.StartDate) = :month")
    .SetParameter("month", "12")
    .List<Project>();

我也试过“从项目 p where p.StartDate.Month = 12”但它没有用。

那么使用 HQL 或标准 API 是否有可能以与数据库无关的方式编写这样的查询?

最佳答案

如果您定期查询月、日、年,您实际上不应该将日期存储为 DateTime 列 - 这会使查询效率极低。您可以轻松地创建一个“月份”列并对其进行查询(您的 DBA 会再次爱上您)

关于c# - 在 HQL 查询的 "where"子句中使用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/317190/

相关文章:

NHibernate 实体和多重关联

c# - 确定 ForEachAsync 并行度的因素

c# - 如何以编程方式扩展 CSS 速记属性?

C#线程不会休眠?

c# - EF .NET Core2 第一次加载需要更多时间

asp.net-mvc - 使用 nlog 在 nhibernate asp.net mvc 应用程序中记录 sql

c# - 将投影添加到 nhibernate 查询

c# - 将一个实体映射到多个表

c# 正则表达式问题 : only letters, 数字和一个点(2 到 20 个字符)允许

c# - 如何使用 nhibernate/lightcore 注册两个数据库连接?