使用Web API 2.2,假设我想要读HttpContent两次,每次都是不同的类型.
await httpContent.LoadIntoBufferAsync(); //necessary to buffer content for multiple reads
var X = await httpContent.ReadAsAsync<T>(); //read as first type
var Y = await httpContent.ReadAsAsync<Dictionary<string, object>>(); //read as second type
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,while X的非null实例是null.如果我切换顺序,将是一个非空字典,而将为null.换句话说,第二次和后续调用将始终返回null,除非使用相同的泛型类型参数调用它们.独立地,要么按预期调用工作(即使在不必要地调用时).TYYXReadAsAsyncReadAsAsyncLoadIntoBufferAsync
这对我来说是意料之外的 - 似乎我应该能够根据需要多次读取缓冲内容作为不同的类型.如果我添加另一行:
var Z = await httpContent.ReadAsString();
Run Code Online (Sandbox Code Playgroud)
Z无论赋值顺序如何,结果都将是一个非空字符串X, Y, Z.
那么怎么来这种情况发生,为什么我不能读取HttpContent使用ReadAsAsync多种类型?
我正在针对包含时间序列中的一堆点的表开发查询.该表可能会变得非常大,因此我希望查询通过在固定时间间隔内平均点来有效地对输出进行下采样.编写查询后,我对SQL Server(2008)如何选择执行查询感到惊讶.执行计划揭示了一种不必要的排序操作,随着时间序列的增长,这种操 这是问题,简化为一个简单的例子:
CREATE TABLE [dbo].[Example]
(
[x] FLOAT NOT NULL,
[y] FLOAT NOT NULL,
PRIMARY KEY CLUSTERED
(
[x] ASC
)
);
SELECT FLOOR([x]), AVG([y])
FROM [dbo].[Example]
GROUP BY FLOOR([x]);
Run Code Online (Sandbox Code Playgroud)
在这里,我有(x,y)对已经按x排序(由于聚集的主键),我对每个整数x平均y(通过截断FLOOR函数).我希望该表已经适合于聚合,因为FLOOR它是单调函数.不幸的是,SQL Server决定需要重新排序这些数据,这是执行计划:

SQL Server是否能够对已经适当排序的列的单调函数分组的数据执行流聚合?
有没有一种通用的方法来重写这样的查询,以便SQL Server将看到订单被保留?
[更新] 我发现了一篇关于SQL需要的主题的文章:单调函数的sargability,正如标题所暗示的,似乎这是SQL Server尚未做的优化(在大多数情况下).
以下是更简单的查询[dbo].[Example],证明了这一点:
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY FLOOR([x]) --sort performed in execution plan
SELECT [x], [y]
FROM [dbo].[Example]
ORDER BY 2*[x] --NO sort performed in execution plan
SELECT [x], …Run Code Online (Sandbox Code Playgroud) 我有一个使用Autofac进行依赖注入的ASP.NET MVC Web应用程序.有时,此Web应用程序将启动一个线程,以便与请求线程分开执行某些工作.当后台线程启动时,它会从根容器建立新的Autofac生存期范围并运行一些操作.
public IAsyncResult Run<T>(Action<T> action)
{
var NewTask = System.Threading.Tasks.Task.Factory.StartNew(() =>
{
using (var Scope = Runtime.Container.BeginLifetimeScope())
{
var Input = Scope.Resolve<T>();
action(Input);
}
});
return NewTask;
}
Run Code Online (Sandbox Code Playgroud)
我的一个与Autofac注册的依赖有两种不同的实现:一个适用于HTTP请求的寿命和其他适合所有其他的寿命.我试着将它们注册如下:
builder
.Register(c => new Foo())
.As<IFoo>()
.InstancePerLifetimeScope();
builder
.Register(c => new FooForHttp(HttpContext.Current))
.As<IFoo>()
.InstancePerMatchingLifetimeScope(WebLifetime.Request);
Run Code Online (Sandbox Code Playgroud)
Autofac选择FooForHttphttp请求(如预期的那样).但是,当我的后台线程旋转时,任何解决的尝试都会IFoo导致异常:
从请求实例的作用域中看不到具有匹配"httpRequest"的标记的作用域.这通常表示注册为每HTTP请求的组件正被SingleInstance()组件(或类似场景)重新请求.在Web集成下,始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,从不从容器本身请求.
我知道Autofac总是使用最后注册的提供程序作为特定组件的默认提供程序.我在这里假设它将使用最后注册的合适提供者.
我是否遗漏了某些内容,或者是否有更好的方法根据当前生命周期范围的标记选择提供商?
是否可以配置实体框架模型,以便在从模型创建数据库时,生成的标识列具有1以外的标识增量?例如,我可能有一个标识列,我想要id的序列:1,11,21,31,...(按10而不是1).
我不太关心身份种子因为我可以在EF生成数据库模式后轻松地使用sql语句重新种子表.但是,似乎如果我想更改身份增量,那么我必须重新创建表(至少在Microsoft Sql Server中).由于外键关系,这可能有点复杂.
那么有没有办法在EF中配置标识列?如果没有,如果可能的话,我也可以在对数据库执行之前检查和修改模式创建脚本.
更新一些其他细节:
我已经覆盖了(包含的实现者)Seed公开的方法.在这里,我在EF创建模式后运行一些自定义初始化例程.我想我可以添加另一个来创建后修改每个标识列规范.但是,如上所述,要更改标识增量,我必须重新创建每个表(及其外键).如果在创建标识列之后没有简单的方法来更改标识列增量,我想在创建标识列之前对其进行配置,以便EF使用除1以外的增量创建标识列,或者修改生成的表创建脚本在执行之前由EF执行.DropCreateDatabaseIfModelChangesIDatabaseInitializer
当JSON.NET序列化类型时,我想在json输出中为特定类型的实例引入一些元数据属性.
在保留序列化上下文和设置的同时引入这些附加属性的最佳方法是什么?
我知道我可以实现JsonConverter并将其添加到序列化程序设置中.以下是一个示例实现WriteJson:
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var Json = JObject.FromObject(value, serializer);
//modify Json by adding some properties ...
Json.WriteTo(writer);
}
Run Code Online (Sandbox Code Playgroud)
但是,这提出了一些我不确定如何解决的问题:
如果通过设置配置序列化程序:
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
然后尝试调用JObject.FromObject(value, serializer)序列化什么,因为JSON.NET已经确定该值被序列化(因此它忽略了序列化相同引用的进一步尝试).
如果我设置ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize然后我最终得到一个无限递归循环.呼叫JObject.FromObject(value, serializer)最终重新进入WriteJson我的自定义JsonConverter.
如果我创建一个新的序列化器或调用JObject.FromObject(value)(如本例所示),我将不再使用相同的序列化器设置.虽然输出将具有额外的属性,但如果已为原始序列化器配置了其他转换器,合同解析器等,则它可能与序列化json的其余部分不匹配.另外,我已经丢失了参考循环处理的序列化上下文,因此将不再跳过原始输出中将跳过的引用.
是否有更好的方法可以挂钩序列化过程,允许您修改原始序列化程序生成的json?
更新:目前我实现了一个不太理想的解决方法,即为Func<JsonSerializerSettings>我的自定义提供设置工厂JsonConverter.提供的设置必须排除转换器以避免递归循环,这不会保留序列化上下文.此外,由于不再配置转换器,因此任何嵌套对象都不会接收其他属性.
我目前有一些堵塞.
我的理论查询看起来像这样:
SELECT * FROM Table WHERE X in (a, b, c) AND Y IN (d, e, f)
Run Code Online (Sandbox Code Playgroud)
所以基本上,我希望所有行都有多列匹配,这意味着:
X, Y
1, 2
3, 4
5, 6
7, 8,
9, 10
Run Code Online (Sandbox Code Playgroud)
如果我想将所有行放在哪里(X=1, Y=2)或者(X=5, Y=6),那么X和Y是相关的,我该怎么做?
(MS SQL2005 +)