我们有一个非常标准的数据导入过程,我们在其中加载一个staging表,然后将MERGE其加载
到target表中.
新要求(绿色)涉及将导入数据的子集捕获到单独的queue表中,以进行完全不相关的处理.
(1)子集由选择的记录组成:target仅新添加到表中的记录.
(2)子集是一些插入列的投影,但也是至少一个仅存在于源(staging
表)中的列.
(3)该MERGE语句已OUTPUT..INTO严格使用该子句记录所$action采用的MERGE,以便我们可以
为统计目的提供PIVOT结果和COUNT插入,更新和删除的数量.我们并不喜欢像这样缓冲整个数据集的操作,而是希望动态聚合总和.不用说,我们不想在此OUTPUT表中添加更多数据.
(4)我们不想做MERGE
任何原因,甚至部分地执行第二次的匹配工作.该
target表是非常大的,我们不能索引一切,操作通常是相当昂贵的(几分钟,而不是秒).
(5)我们不考虑将任何输出从MERGE客户端传输到客户端,以便客户端可以queue通过立即将其发送回来将其路由到客户端.数据必须保留在服务器上.
(6)我们希望避免在staging和之间的临时存储中缓冲整个数据集queue.
最好的方法是什么?
(a)仅将插入的记录排入队列的要求使我们无法queue直接将表格中的表格置于OUTPUT..INTO其中MERGE,因为它不允许任何WHERE条款.我们可以使用一些
CASE技巧来标记不需要的记录,以便在queue不进行处理的情况下进行后续删除,但这看起来很疯狂.
(b)因为用于表的某些列queue没有出现在
target表中,我们不能简单地在目标表上添加插入触发器来加载queue."数据流分裂"必须尽快发生.
(c)由于我们已经在中使用了一个OUTPUT..INTO子句MERGE,我们不能添加第二个OUTPUT子句并将其 …
我在我的表中存储了一些过滤数据.让我更清楚一点:我想将一些where子句及其值存储在数据库中,并在我想从数据库中检索数据时使用它们.
例如,考虑一个people表(实体集)和另一个表中的一些过滤器:
"age" , "> 70"
"gender" , "= male"
Run Code Online (Sandbox Code Playgroud)
现在,当我从people表中检索数据时,我想让这些过滤器过滤我的数据.
我知道我可以生成一个SQL查询作为字符串并执行它,但在EF,LINQ中还有其他更好的方法吗?
我试图通过代码契约获得VS2010 Ultimate以生成错误而不是警告.
我有这个简单的测试程序:
using System.Diagnostics.Contracts;
namespace MyError
{
public class Program
{
static void Main(string[] args)
{
Program prog = new Program();
prog.Log(null);
}
public void Log(string msg)
{
Contract.Requires(msg != null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它正确地确定违反了合同:
C:\...\Program.cs(10,13): warning : CodeContracts: requires is false: msg != null
Run Code Online (Sandbox Code Playgroud)
在我的csproj文件中有Debug的这个属性字段:
TreatWarningsAsErrors>true
我是否还需要在项目设置中设置其他内容才能将这些内容变为错误?
tl; dr强类型资源代码生成是否适用于普通(非嵌入)资源App_LocalResources?
如果不是那么为什么,并且在卫星装配中使用嵌入资源的替代方案是否可以与隐式本地化一起使
本文的其余部分只是解释了我目前在解决这些问题的位置,如果您知道答案,请随时忽略它.
当使用隐式本地化(meta:resourceKey="Foo"语法)时,我理解如果想要将资源嵌入到附属程序集中,则需要编写自己的资源提供程序.原因是ASP.NET总是使用这些的默认提供程序,并且此提供程序期望可以在运行时检索其中的resx文件App_LocalResources.另见这个问题,在撰写本文时尚无答案.
如果这个假设是正确的,那么在ResXFileCodeGenerator没有编写这样的提供者(我们希望避免这样做)的情况下似乎不可能使用强类型生成的类(使用),因为启用代码生成需要使用嵌入式资源.
因为生成类型的使用似乎对全局资源完全正常,所以我想质疑第二个假设:
App_GlobalResources使用中GlobalResourceProxyGenerator)生成强类型类而不将它们嵌入到附属程序Build Action集中(设置Content为相反Embedded),那么为什么我不能对本地资源执行相同操作? 为什么生成的代码无法找到并使用这些resx文件App_LocalResources?请注意,尝试执行此操作时抛出的异常System.Resources.MissingManifestResourceException包含以下消息:
找不到适合指定文化或中性文化的资源.确保在编译时将"PROJECT.App_LocalResources.PAGE.aspx.resources"正确嵌入或链接到程序集"PROJECT"中,或者所有所需的附属程序集都是可加载和完全签名的.
我知道这条消息具有误导性,因为它清楚地查找了附属程序集,而不是尝试resx文件(或者运行时编译的任何内容,App_LocalResources.dll我猜).
如果有充分的理由不允许这样做(并且我们因此被迫在卫星装配中使用嵌入式资源),那么在进行隐式本地化时是否可以在资源提供程序中查找资源? 当然有人曾试图这样做,并且听起来不像应用程序开发人员的工作来解决这种管道问题.
作为前一个问题的一个子问题,我还假设在卫星程序集中使用嵌入式资源时,不会将resx文件放在App_*目录中,因为这些是运行时使用的特殊目录.实际上,resx文件甚至没有部署,因此目录将为空.这是正确的,有什么可以通过作为最佳做法?
我想另一种制定问题的方法是:我是否可以ResXFileCodeGenerator像GlobalResourceProxyGenerator生成可以加载运行时编译的程序集的代码那样表现,而不是在构建时编译的附属程序集?
我的理解是它不应该发生,但确实如此.这些库最合适的解决方法是什么?
笔记:
require.js手动(使用脚本标记)之后运行这些脚本应该可以工作,事实上它确实如此.但是,RequireJS文档明确警告该data-main脚本是异步运行的.虽然require.js应该已经正确定义了define定义多个命名模块的脚本所需的功能,但我还假设如果没有从data-main脚本加载适当的配置,可能会以不确定的方式发生不良事件.它是否正确?shim,map,bundles和paths配置属性可以在这种情况下帮助,但我希望我失去了它.澄清第一个注释:(我的不好,现在还不清楚)
我在这里描述的只是手动执行(使用HTML脚本标记)在 RequireJS和data-main脚本之后定义多个模块的脚本.知道后者运行异步,我的担忧应该变得更加明显(但请随时让我详细说明).其中很大一部分虽然我似乎可以成功地要求每个命名模块,但我不确定该行为是否具有确定性(同样,它不是很漂亮,我更愿意避免使用其他脚本标记并正确地异步加载所有内容) .
<script src="scripts/require.js" data-main="app/main.js"></script>
<script src="scripts/datajs-1.1.2.js"></script>
Run Code Online (Sandbox Code Playgroud)
这里,datajs-1.1.2.js定义了两个模块,如上面的链接所述,并在下面复制:
// AMD support
if (typeof define === 'function' && define.amd) {
define('datajs', datajs);
define('OData', odata);
} ...
Run Code Online (Sandbox Code Playgroud) 对于ASP.NET Web API,我一直在研究自己的实现,IHttpControllerActivator并且想知道何时(或为什么?)使用HttpRequestMessage扩展方法" RegisterForDispose".
我看到这样的例子,我可以看到它的相关性,因为IHttpController不继承IDisposable,而IHttpController的实现并不保证它自己的dispose逻辑.
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var controller = (IHttpController) _kernel.Get(controllerType);
request.RegisterForDispose( new Release(()=> _kernel.Release(controller)));
return controller;
}
但后来我看到这样的事情并开始怀疑:
public IHttpController Create(
HttpRequestMessage request,
HttpControllerDescriptor controllerDescriptor,
Type controllerType)
{
if (controllerType == typeof(RootController))
{
var disposableQuery = new DisposableStatusQuery();
request.RegisterForDispose(disposableQuery);
return new RootController(disposableQuery);
}
return null;
}
在这个例子中,RootController在这里没有注册处理,大概是因为它是一个ApiController或MVC控制器? - 因此会自行处理.
DisposableStatusQuery的实例已注册处置,因为它是一个一次性对象,但为什么控制器不能处理实例本身?RootController具有disposableQuery(或者更确切地说,它的接口或抽象基础)的知识,因此会知道它是一次性的.
我什么时候才能真正需要使用HttpRequestMessage.RegisterForDispose?
我们想与翻译人员交换 PO 文件,并将这些文件转换为 i18next 的原生 JSON 格式。使用i18next-conv 实用程序听起来很简单。
但是,i18next 需要或多或少的特殊键;例如,点对于 i18next 命名空间具有特殊含义。相比之下,gettext PO 文件旨在为其消息 ID携带源字符串(原始语言)。
我们知道消息 ID 可以是任意的,因此可以直接映射到 i18next 键,但是出于各种原因,我们希望使用源字符串并使用 PO 文件。
主要原因是我们想使用的所有翻译工具,可能还有我们所有翻译人员的工具,都期待这一点。使用符号键会使翻译变得非常痛苦。无论如何,我们从围绕这个问题的辩论中得出的结论是,这主要是一个意见问题;我们有点做我们的,我们想把这个限制作为这个问题的要求。
此外,我们想知道一般的工作流程。原始的 PO 文件是如何生成的?翻译文件是如何维护的?
我们知道这些问题是非常基本的,但我们发现有关 i18next-gettext 集成的信息如此之少,这让我们感到有些惊讶。i18next-conv 工具存在并且像宣传的那样完美运行,但它真的有用吗?人们真的使用它吗?如果是这样,我们的问题是否相关?
最后,我们对系统成熟度的期望是不是有点太高了?
javascript localization gettext internationalization i18next
我想对s的List元素数进行排序IGrouping.
就是这样,理想情况下列表应该是相同的.我会妥协一个新的列表,但那么元素应该是完全相同的原始对象,而不是副本(无论多浅),绝对不是匿名对象.
具体来说:我们有一个具有许多属性的实体,以及这种类型的对象列表.我们希望(1)通过某些属性(名称,地址,...)对对象进行分组,然后(2)计算每个组中元素的数量.最后,我们希望(3)通过首先放置属于较大组的元素,根据这些计数对列表进行重新排序.
注意:我们的主要问题是我们似乎无法找到一种方法来保持对组元素中原始对象的引用.实际上,我们可以在Linq查询中选择的是分组键(或键的属性),并且没有任何其他内容IGrouping.我们无法弄清楚如何将组元素与列表元素相关联,而不是查看数据(即便如此,我们还需要主键,我们无法将其添加到分组键或它会打败分组开始的目的).
jQuery的jQuery API文档.remove()提到:
除了元素本身之外,还删除了与元素关联的所有绑定事件和jQuery数据.
我认为"绑定事件"在这里意味着"事件处理程序"; 类似的文档.empty()说:
为了避免内存泄漏,jQuery在删除元素本身之前从子元素中删除了其他构造,如数据和事件处理程序.
如果不使用这些功能并使用Node.removeChild()(或ChildNode.remove())代替,它听起来就像会发生泄漏.
对现代浏览器来说这是真的吗?
data-属性是否合适?jQuery.data()(低级功能)的文档说:
jQuery.data()方法允许我们以一种不受循环引用安全的方式将任何类型的数据附加到DOM元素,从而避免内存泄漏.jQuery确保在通过jQuery方法删除DOM元素时以及当用户离开页面时删除数据.
这听起来很像是旧的IE DOM/JS圆形泄漏模式的解决方案,AFAIK在今天的所有浏览器中都得到了解决.
但是,jQuery src/data.js代码(快照)中的注释说:
为2014年的WeakMap实施升级提供明确的途径
这表明将来仍然考虑使用带有地图的单独数据存储来严格存储与DOM外部的DOM节点严格关联的数据的想法.
这只是为了向后兼容,还是更多呢?
提供给像这样的其他问题的答案似乎也暗示外部映射的唯一原因是避免DOM对象和JS对象之间的循环引用,我认为这在这个问题的上下文中是无关紧要的(除非我弄错了).
此外,我已经看到插件现在直接在相关的DOM节点上设置属性(例如selectize.js),它似乎并没有打扰任何人.这是一个好的做法吗?它看起来确实如此,因为它可以很容易地删除整个DOM树.无需将其拆除,无需清理任何外部数据存储,只需将其从父节点分离,丢失引用,并让垃圾收集器执行其操作.
这种功能对于管理视图的框架(例如Durandal)尤其有用,这些框架经常需要替换在其体系结构中表示所述视图的整个树.虽然他们中的大多数肯定明确支持jQuery,但这个解决方案根本不能扩展.还必须清除使用类似数据存储的每个组件.在Durandal的情况下,似乎它们(至少在一次出现时,对话框插件 - 快照)依赖于Knockout .removeNode()(快照)实用程序函数,后者又使用jQuery的内部cleanData()函数.那就是,恕我直言,这是一个可怕的特殊外壳的一个主要例子(我不确定它现在是否正常,如果jQuery用于noConflict模式,它在大多数AMD设置中).
这就是为什么我想知道我是否可以安全地忽略所有这些,或者我们是否必须等待Web Components才能重新获得我们久已失去的理智.
我知道其他存储解决方案几乎适用于任何非静态数据.
但是,我仍然看到一些人使用Azure网站服务中提供的文件系统,该服务目前占用10GB空间,特别是对于顽固的App_Data使用.
出于好奇,如果不是:
如果它没有复制,
谢谢.
cloud performance azure azure-web-sites distributed-filesystem
asp.net ×2
javascript ×2
linq ×2
localization ×2
sql ×2
sql-server ×2
amd ×1
asp.net-mvc ×1
azure ×1
c# ×1
cloud ×1
datajs ×1
dom ×1
gettext ×1
group-by ×1
i18next ×1
jquery ×1
performance ×1
requirejs ×1
sql-merge ×1
t-sql ×1
webforms ×1