抱歉,如果这似乎是一个简单的问题,但我大多只想检查我所拥有的解决方案对于所有情况都是最明智/最有效的.
我们使用的预先存在的SQL Server数据库将'period'存储为包含start - >包含结束UTC DateTime值.(开始和结束列都会datetime2(7)自动转换为我们开始使用它们之前的System.DateTime实例DateTimeKind.UTC).
因此,如果我需要存储"整天/月/年,给定用户的时区",我需要找到"特定DateTimeZone中指定LocalDate的最后一个可能的瞬间".
我的方法如下:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime AtEndOfDay(this DateTimeZone zone, LocalDate localDate)
{
return zone
.AtStartOfDay(localDate.PlusDays(1))
.Plus(Duration.FromTicks(-1));
}
Run Code Online (Sandbox Code Playgroud)
我想我还需要避免(在任何其他地方)映射"日期结束" LocalDateTime使用,.AtLeniently(..)因为如果23:59:59.9999999被"跳过"并且在目标中不存在DateTimeZone,那么它将被映射到下一个可用的瞬间缺口00:00:00.000000的'外侧',这将给我一个独家 ZonedDateTime价值.
修订方法:
public static LocalDateTime AtEndOfDay(this LocalDate localDate)
{
// TODO: Replace with localDate.At(LocalTime.MaxValue) when NodaTime 2.0 is released.
return localDate
.PlusDays(1)
.AtMidnight()
.PlusTicks(-1);
}
public static ZonedDateTime …Run Code Online (Sandbox Code Playgroud) 我有以下格式的JSON:
{
"users": [
{
"first_name": "John",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ],
"animals": [ [ "FOO", "ANIMAL-22" ] ]
},
{
"first_name": "Susan",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ]
}
],
"BAR": {
"VET-1": {
"vet_name": "Acme, Inc",
"vet_id": 456
},
"ANIMAL-22": {
"animal_name": "Fido",
"species": "dog",
"animal_id": 789,
"vet": [ "FOO", "VET-1" ]
}
}
}
Run Code Online (Sandbox Code Playgroud)
某些嵌套对象或多次引用的对象被序列化为引用.
然后,引用的对象包含在BARJSON对象末尾的数组中,并由[ "FOO", "ANIMAL-22" ]数组确定.
(这两个FOO和BAR是静态常数,和ANIMAL-22/ VET-1标识符是半随机的)
不幸的是,这与Json.NET …
这是我今天早上在使用 ASP.NET MVC 的 URL 路由时遇到的一个问题的精简示例。
相当简单,我想要调用路由的 Action,无论是否提供了最后的参数。
这条路线工作正常,匹配/apple/和/apple/test/
路线.MapRoute(
《工作路线》
"苹果/{参数}",
新的 {
控制器 = "苹果",
action = "动作",
参数 = UrlParameter.Optional
},
新 { 参数 = @"([a-z0-9\.-]+)" }
);
但是,第二条路线只会匹配/banana/test/等。当我尝试/banana/ 时,路由器正好经过它并返回全部 404 错误。
路线.MapRoute(
"非工作路线",
"香蕉/{参数}",
新的 {
控制器 = "香蕉",
action = "动作",
参数 = UrlParameter.Optional
},
新 { 参数 = @"([a-z0-9]+)" }
);
唯一的区别是参数的正则表达式验证,但由于它是一个非常简单的正则表达式匹配,它们对于像/banana/这样的 URL 应该都可以正常工作,但第二条路由无法识别它。
我只是通过更改路线 #2 上的正则表达式以匹配路线 #1 上的正则表达式来回避我的问题,并接受 '.' 和“-”字符,我只是想知道是否有人知道为什么会发生这种情况。
编辑:
以下是我在示例中使用的控制器和操作。这里没什么好看的。
公共类 AppleController …
我正在尝试动态构造一个类似于下面的表达式,我可以使用相同的比较函数,但是可以传入被比较的值,因为值是从属性'higher-up'传递的查询.
var people = People
.Where(p => p.Cars
.Any(c => c.Colour == p.FavouriteColour));
Run Code Online (Sandbox Code Playgroud)
我相信我已正确构造了查询,但是ExpressionExpander.VisitMethodCall(..)当我尝试使用它时,该方法会抛出以下异常:
"无法将'System.Linq.Expressions.InstanceMethodCallExpressionN'类型的对象强制转换为'System.Linq.Expressions.LambdaExpression'"
在真实世界的代码中,使用实体框架和实际IQueryable<T>,我经常得到:
"无法将类型为'System.Linq.Expressions.MethodCallExpressionN'的对象转换为'System.Linq.Expressions.LambdaExpression'".
我构建了一个LinqPad友好的问题示例,就像我能做到的那样简单.
void Main()
{
var tuples = new List<Tuple<String, int>>() {
new Tuple<String, int>("Hello", 4),
new Tuple<String, int>("World", 2),
new Tuple<String, int>("Cheese", 20)
};
var queryableTuples = tuples.AsQueryable();
// For this example, I want to check which of these strings are longer than their accompanying number.
// The expression I want to build needs to use one of the …Run Code Online (Sandbox Code Playgroud) c# ×3
asp.net-mvc ×1
expression ×1
json ×1
json.net ×1
linq ×1
linqkit ×1
nodatime ×1
regex ×1
routing ×1
url-routing ×1