Entity framework 实体框架6 ToString(),格式化(日期时间格式),查询截获

Entity framework 实体框架6 ToString(),格式化(日期时间格式),查询截获,entity-framework,linq-to-sql,mapping,Entity Framework,Linq To Sql,Mapping,我没有找到在DateTime(DateTime?)字段中使用linq2sql进行搜索的正确方法 db.Items.Where(x=>x.DateTime1.ToString()包含(“2014.08”)) 不起作用,因为在linq2sql中创建CAST([XXXX.DateTime1]作为NVARCHAR(MAX))=“2014年8月4日”而不是2014.08 我尝试使用自定义函数映射,但没有结果 mssql中的函数 创建函数[dbo].[ToString](@P sql\u variant)

我没有找到在DateTime(DateTime?)字段中使用linq2sql进行搜索的正确方法

db.Items.Where(x=>x.DateTime1.ToString()包含(“2014.08”))
不起作用,因为在linq2sql中创建CAST([XXXX.DateTime1]作为NVARCHAR(MAX))=“2014年8月4日”而不是2014.08

我尝试使用自定义函数映射,但没有结果

  • mssql中的函数
  • 创建函数[dbo].[ToString](@P sql\u variant)
    返回NVARCHAR(20)
    作为
    开始
    如果(sql变量属性(@P,'BaseType')='datetime')
    返回转换(NVARCHAR(10),@p102)+''+转换(NVARCHAR(8),@p108);
    返回施法(@P为NVARCHAR(最大值));
    结束
    
  • 创建sql执行拦截器
  • 公共类DbCommandInterceptor:IDBComandInterceptor
    {
    public void reader执行(DbCommand命令,DbCommandInterceptionContext interceptionContext)
    {
    if(command.CommandText.IndexOf(“CAST”)!=-1)
    {
    command.CommandText=command.CommandText.Replace(“CAST”(,“dbo.ToString”();
    command.CommandText=command.CommandText.Replace(“]作为nvarchar(max))”,“])”;
    }
    }
    
    }

  • 向DbContext添加拦截器
  • 公共类DB:DbContext
    {
    public DB():base(@“Data Source=localhost\SQLEXPRESS;Initial Catalog=EFTest”)
    {
    添加(新的DbCommandInterceptor());
    }
    }
    
    为什么不直接使用年和月属性?您应该能够将字符串输入转换为年和月编号。然后你做一些类似的事情:

    db.Items.Where(x => 
       x.DateTime1.Value.Year == 2014 
       && x.DateTime1.Value.Month == 8)
    
    它将简单地转换为:

    WHERE (2014 = (DATEPART (year, [Extent1].[Date]))) 
    AND     (8 = (DATEPART (month, [Extent1].[Date])))
    
    更新 您可以使用和生成以下格式
    yyyy.mm.dd

    db.Items.Where(x => 
        (SqlFunctions.DatePart("yyyy", x.DateTime) + "."
        + DbFunctions.Right("0" + SqlFunctions.DatePart("m", x.DateTime1), 2) + "."
        + DbFunctions.Right("0" + SqlFunctions.DatePart("d", x.DateTime1), 2))
        .Contains("2014.08"));
    

    用户类型字符串“2014.08”或“08.08”或“14.08”等。我需要在日期时间字段中搜索该字符串。@AlexandrSulimov,我更新了答案。它应该产生你想要的格式。你们可以使用它,以防你们想阻止使用拦截器,因为它是全局应用的。用户过滤器为“12.12”
    s可能为“2012.12.01”或“2010.12.12”。或者用户过滤器是“12”,它是任何数据时间中的任意12。嗯,应该可以,我用你的示例
    2012.12.01
    2012.12.12
    ,过滤器是
    12.12
    12
    ,两个日期时间都匹配这两个过滤器,因为在数据库中,这些将被转换为
    2012.12.01
    2012.12.12
    包含的
    将执行字符串筛选任务,所以您的方法很好。但是我不能用表达式()来具体化这个查询,它可以作为研究的样本,但不能推荐:替换每个CAST(使用dbo.ToString(-)通常不起作用,因为EF使用CAST(由它自己主动地也。。。