Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF日期时间格式_C#_Entity Framework_Linq_Datetime_Iqueryable - Fatal编程技术网

C# EF日期时间格式

C# EF日期时间格式,c#,entity-framework,linq,datetime,iqueryable,C#,Entity Framework,Linq,Datetime,Iqueryable,我首先使用EF 6代码,需要在特定格式的日期时间上执行类似sql的操作,例如: 我的第一次尝试大致如下: var users = context.User .Where(x => x.BirthDate.ToString("dd/MMM/yyyy h:mm tt").Contains(searchTerm).ToList() 这会引发一个异常,其中as-EF不知道如何将DateTime.ToString()转换为SQL,这很有意义 到目前为止,我找到的最好的解决方案是从这个

我首先使用EF 6代码,需要在特定格式的日期时间上执行类似sql的操作,例如:

我的第一次尝试大致如下:

var users = context.User
       .Where(x => x.BirthDate.ToString("dd/MMM/yyyy h:mm tt").Contains(searchTerm).ToList()
这会引发一个异常,其中as-EF不知道如何将DateTime.ToString()转换为SQL,这很有意义

到目前为止,我找到的最好的解决方案是从这个页面:在这里,回答者使用函数:
SqlFunctions.DatePart
DbFunctions.Right
来生成一个字符串,EF可以执行
包含的
,但是对于我的场景,我特别需要格式为
“dd/MMM/yyyy hh:mm tt”
(2017年1月20日上午8:22)目前,我正努力以MMM的形式发布月度报告


另一方面,如果有另一种方法可以实现这一点,比如通过创建我自己的从or类扩展而来的函数,这也可以达到目的。

要以
MMM
格式获取月份,您可以使用:

DbFunctions.Left(SqlFunctions.DateName("month", x.BirthDate),3)
最终查询可能如下所示:

var users = context.User
   .Where(x =>
        (DbFunctions.Right("0" + SqlFunctions.DatePart("d", x.BirthDate), 2) + "/" //day
            + DbFunctions.Left(SqlFunctions.DateName("month", x.BirthDate), 3) + "/" // month
            + SqlFunctions.DatePart("yyyy", x.BirthDate) + " "
            + DbFunctions.Right("0" + (x.BirthDate.Hour > 12 ? x.BirthDate.Hour % 12 : x.BirthDate.Hour).ToString(), 2) + ":"
            + DbFunctions.Right("0" + SqlFunctions.DatePart("mi", x.BirthDate), 2) + " "
            + (x.BirthDate.Value.Hour > 11 ? "PM" : "AM"))
        .Contains(searchTerm)
    ).ToList();

但是我担心性能。

如果搜索特定格式的日期列很重要,那么我建议在表中添加一个计算列,以显示作为字符串的日期/时间。使用此类解决方案需要注意的是性能。对于较小或中等大小的表/DB,这是可以接受的,但是您需要监控性能,避免使用像这样的技术作为支撑,因为随着系统的发展,它可能会反过来影响您

ALTER TABLE Users
ADD COLUMN FormattedBirthDate AS formatDate(BirthDate)
其中formatDate是标量函数:

CREATE FUNCTION formatDate 
(
    @dateTime AS DateTime
)
RETURNS VARCHAR(50)
AS
BEGIN
    DECLARE @result AS VARCHAR(50)

    IF @dateTime IS NULL
      RETURN NULL

    SELECT @result = CAST(DATEPART(dd, @dateTime) AS VARCHAR) + '/' + LEFT(DATENAME(MONTH, @dateTime),3) + '/' + CAST(YEAR(@dateTime) AS VARCHAR) + ' ' + CAST(DATEPART(HOUR, @dateTime) - (12 * CEILING((DATEPART(HOUR, @dateTime) - 12)*.1)) AS VARCHAR(2)) + ':' + RIGHT('00' + CAST(DATEPART(MINUTE,@dateTime) AS VARCHAR(2)),2) + ' ' + CASE WHEN DATEPART(HOUR,@dateTime) >= 12 THEN 'PM' ELSE 'AM' END
    RETURN @result

END
这将根据您指定的内容应用静态格式。阅读起来很难看,可能会有一些优化

这将公开一个名为FormattedBirthDate的新列,您可以在EF中映射该列,但您需要采取措施确保它被视为只读列,并被识别为计算列。我不会在ViewModels等中返回它,仅用于搜索

在用户实体中:

public string FormattedBirthDate { get; private set;}
在用户实体类型配置中:

Property(x => x.FormattedBirthDate)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

这将确保在保存对出生日期的更改后,实体的格式化出生日期将被刷新。因此,需要注意的是,如果更改出生日期,则在调用SaveChanges之前,格式化的出生日期将与出生日期不匹配。

我建议使用
TryParseExact
转换您的输入日期,并使用结果<代码>日期时间查询筛选器中的变量