gpt4 book ai didi

具有自定义格式的 C# 通用 DateTime.ToString()

转载 作者:行者123 更新时间:2023-11-30 16:50:12 25 4
gpt4 key购买 nike

<分区>

使用时:

DateTime.ToString().Contains("2016")

Entity Framework 产生:

CAST(DateValue AS nvarchar(max)) LIKE '%2016%'

这使用默认的日期格式“mon dd yyyy hh:miAM(或 PM)”

我想使用“yyyy-mm-dd hh:mi:ss (24h)”,它可以通过以下方式获得:

CONVERT(VARCHAR(max), DateValue, 20) LIKE '%2016%'

我需要帮助将此格式实现到现有的通用方法。

static Expression<Func<T, TResult>> Expr<T, TResult>(Expression<Func<T, TResult>> source) { return source; }
static MethodInfo GetMethod(this LambdaExpression source) { return ((MethodCallExpression)source.Body).Method; }
static readonly MethodInfo Object_ToString = Expr((object x) => x.ToString()).GetMethod();
static readonly MethodInfo String_Contains = Expr((string x) => x.Contains("y")).GetMethod();

public static IQueryable<T> Filter<T>(this IQueryable<T> query, List<SearchFilterDto> filters)
where T : BaseEntity
{
if (filters != null && filters.Count > 0 && !filters.Any(f => string.IsNullOrEmpty(f.Filter)))
{
var item = Expression.Parameter(query.ElementType, "item");
var body = filters.Select(f =>
{
var value = f.Column.Split('.').Aggregate((Expression)item, Expression.PropertyOrField);
if (value.Type != typeof(string))
{
value = Expression.Call(value, Object_ToString);
}

return (Expression)Expression.Call(value, String_Contains, Expression.Constant(f.Filter));
})
.Where(r => r != null)
.Aggregate(Expression.AndAlso);

var predicate = Expression.Lambda(body, item);
MethodInfo whereCall = (typeof(Queryable).GetMethods().First(mi => mi.Name == "Where" && mi.GetParameters().Length == 2).MakeGenericMethod(query.ElementType));
MethodCallExpression call = Expression.Call(whereCall, new Expression[] { query.Expression, predicate });
query = query.Provider.CreateQuery<T>(call);
}
return query;
}

请注意,这是一个示例 - 它不会总是“2016”,也不总是一年。用户可以键入时间或“01”以调用该月第一天、一月或 2001 年的所有记录。这是一个非常灵活的过滤器。

我也明白很多人不会喜欢这种情况,但我真的在这里寻找解决方案而不是被告知“不要这样做”

该解决方案还需要满足 LINQ to Entities 的需求,因此我不能简单地使用 .ToString("MMM d yyyy H:mm tt"),因为这将导致:

“LINQ to Entities 无法识别‘System.String ToString(System.String)’方法,并且无法将此方法转换为存储表达式。”

该代码使用默认日期格式。我提出问题的原因是通过在 Entity Framework 中操作查询来更改 SQL 级别的日期格式。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com