抱歉,如果这似乎是一个简单的问题,但我大多只想检查我所拥有的解决方案对于所有情况都是最明智/最有效的.
我们使用的预先存在的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)
某些嵌套对象或多次引用的对象被序列化为引用.
然后,引用的对象包含在BAR
JSON对象末尾的数组中,并由[ "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