Entity framework 实体框架6 ToString(),格式化(日期时间格式),查询截获
我没有找到在DateTime(DateTime?)字段中使用linq2sql进行搜索的正确方法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)
db.Items.Where(x=>x.DateTime1.ToString()包含(“2014.08”))
不起作用,因为在linq2sql中创建CAST([XXXX.DateTime1]作为NVARCHAR(MAX))=“2014年8月4日”而不是2014.08
我尝试使用自定义函数映射,但没有结果
创建函数[dbo].[ToString](@P sql\u variant)
返回NVARCHAR(20)
作为
开始
如果(sql变量属性(@P,'BaseType')='datetime')
返回转换(NVARCHAR(10),@p102)+''+转换(NVARCHAR(8),@p108);
返回施法(@P为NVARCHAR(最大值));
结束
公共类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))”,“])”;
}
}
}
公共类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(由它自己主动地也。。。