我找不到在DateTime(DateTime?)字段中使用linq2sql进行搜索的正确方法。
db.Items.Where(x => x.DateTime1.ToString().Contains("2014.08"))
无法工作,因为在linq2sql中创建CAST([XXXX.DateTime1] AS NVARCHAR(MAX)) = '04 Aug 2014' NOT 2014.08
我尝试使用自定义函数映射,但没有结果。
我找不到在DateTime(DateTime?)字段中使用linq2sql进行搜索的正确方法。
db.Items.Where(x => x.DateTime1.ToString().Contains("2014.08"))
无法工作,因为在linq2sql中创建CAST([XXXX.DateTime1] AS NVARCHAR(MAX)) = '04 Aug 2014' NOT 2014.08
我尝试使用自定义函数映射,但没有结果。
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])))
您可以使用SqlFunctions.DatePart
和DbFunctions.Right
来生成以下格式的日期 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"));
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
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))", "])");
}
}
}
public class DB : DbContext
{
public DB(): base(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=EFTest")
{
DbInterception.Add(new DbCommandInterceptor ());
}
}
2012.12.01
和2012.12.12
,过滤器是12.12
和12
,两个日期时间都匹配这两个过滤器,因为在数据库中它们将被转换为2012.12.01
和2012.12.12
,而Contains
将执行字符串过滤。 - Yuliam ChandraDatePart
接受可空参数,而可空参数可以接受非可空参数。 - Yuliam Chandra