首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6 ToString(),格式化(DateTime格式),查询拦截

实体框架6 ToString(),格式化(DateTime格式),查询拦截
EN

Stack Overflow用户
提问于 2014-08-07 10:40:16
回答 2查看 3.1K关注 0票数 3

在linq2sql in DateTime中,我没有找到正确的搜索方式(DateTime?)字段。

代码语言:javascript
复制
db.Items.Where(x => x.DateTime1.ToString().Contains("2014.08"))

不工作,因为在linq2sql create CAST(XXXX.DateTime1 AS NVARCHAR(最大))= '04‘2014年8月’不是2014.08

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-08 13:36:55

你为什么不直接用年月房呢?您应该能够将字符串输入转换为年份和月份号。然后你就会做这样的事情:

代码语言:javascript
复制
db.Items.Where(x => 
   x.DateTime1.Value.Year == 2014 
   && x.DateTime1.Value.Month == 8)

它将简单地转换为:

代码语言:javascript
复制
WHERE (2014 = (DATEPART (year, [Extent1].[Date]))) 
AND     (8 = (DATEPART (month, [Extent1].[Date])))

更新

您可以使用SqlFunctions.DatePartDbFunctions.Right生成以下格式的yyyy.mm.dd

代码语言:javascript
复制
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"));
票数 4
EN

Stack Overflow用户

发布于 2014-08-07 10:40:16

  1. 函数在MS中的应用

代码语言:javascript
复制
CREATE FUNCTION [dbo].[ToString](@P sql_variant)
RETURNS NVARCHAR(20)
AS
BEGIN
    IF (sql_variant_property(@P, 'BaseType') = 'datetime')
        RETURN CONVERT(NVARCHAR(10), @P, 102) + ' ' + CONVERT(NVARCHAR(8), @P, 108);

RETURN CAST(@P as NVARCHAR(max));
END
  1. 创建sql执行拦截器

代码语言:javascript
复制
public class DbCommandInterceptor  : IDbCommandInterceptor 
{
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
    {
        if (command.CommandText.IndexOf("CAST") != -1)
        {
            command.CommandText = command.CommandText.Replace("CAST(", "dbo.ToString(");
            command.CommandText = command.CommandText.Replace("] AS nvarchar(max))", "])");

        }
    }

}

  1. 向DbContext中添加阻断器

代码语言:javascript
复制
public class DB : DbContext
{
    public DB(): base(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=EFTest")
    {
        DbInterception.Add(new DbCommandInterceptor ());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25180382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档