我主要担心的是在表达式评估之前更改属性值"而不是日期时间解析逻辑"因为在其他情况下我只需要将其他属性值从x更改为y
在我的EntityFramework 6应用程序中,我有日期时间输入格式的应用程序设置" mm / dd / yyyy"或者" dd / mm / yyyy",当用户发出请求(查询或保存更改)时,我想将所有日期时间格式更改为mm / dd / yyyy,如果设置为mm / dd / yyyy则无变化需要,但如果设置是dd / mm / yyyy然后我需要将其转换为mm / dd / yyyy,我需要知道在何处以及如何覆盖属性值并实现目标,我是ExpressionVisitors中的新手。
这可能是起点
internal class DateTimeInterceptor : IDbCommandTreeInterceptor
{
public void TreeCreated(DbCommandTreeInterceptionContext interceptionContext)
{
if (interceptionContext.OriginalResult.DataSpace == DataSpace.SSpace)
{
var queryCommand = interceptionContext.Result as DbQueryCommandTree;
if (queryCommand != null)
{
var newQuery = queryCommand.Query.Accept(new DateTimeQueryVisitor());
interceptionContext.Result = new DbQueryCommandTree(queryCommand.MetadataWorkspace, queryCommand.DataSpace, newQuery);
}
}
}
}
internal class DateTimeQueryVisitor : DefaultExpressionVisitor
{
public override DbExpression Visit(DbScanExpression expression)
{
if (!expression.Target.ElementType.MetadataProperties.Any(mp => mp.Name.GetType() == typeof(DateTime)))
{
return base.Visit(expression);
}
// here i should do the work for changing the property value
// Change the expression
var binding = expression.Bind();
return binding.Expression; //should be replaced with the modified expression
}
}
谢谢
答案 0 :(得分:0)
我认为它是可撤销的,作为一个人而不是一台机器告诉我,这是什么格式:02/02/2014?你能猜出哪一天是哪一天,这是哪个月?
无论如何关于DateTime
解析你可以阅读一些here:
修改的 抱歉,我打算发表评论而不回答,如果有人对此有疑问,请回答一下,请告诉我将其删除。
答案 1 :(得分:0)
您无法识别用户正在使用该日期时间的格式。您应该知道日期时间与您在机器控制面板中设置的日期时间相同。
您可能获得用户使用另一种格式的唯一方法是日期和月份的例外情况。
例如,您希望拥有mm/dd/yyyy
,因此如果用户使用dd/mm/yyyy
格式,则会在12号之后导致错误。然后您可以更改为特殊的日期时间。
想象一下,您的系统设置为mm/dd/yyyy
,然后您可以使用以下代码:
try
{
DateTime dt = DateTime.Parse(Console.ReadLine());
int month = dt.Month;
string datetime = dt.ToShortDateString();
// Do Whatever You Want With The String
.
.
.
.
}
catch (Exception)
{
Console.WriteLine("EORROR. Incorrect DateTime Format ...");
// Now You Must Change dd/mm/yyyy to mm/dd/yyyy
.
.
.
.
}
注意:如果系统的日期设置为dd/mm/yyyy
格式,则不会出现任何错误。确保将系统的格式设置为mm/dd/yyyy
以便使用代码。