Eni*_*ity 6 c# magento linqpad
我使用LinqPad和MySQL IQ驱动程序来查询来自Magento数据库的数据.我不仅使用它来报告数据库,还进行更新.我可以使用标准SubmitChanges()方法来更新数据,但这通常会导致无法忍受的缓慢更新,这可能需要几个小时 - 我的一个表有35,707条记录,我会定期重新创建.
因此,我在LinqPad查询中生成SQL语句,然后在语言下拉列表中选择"SQL"后在单独的选项卡中执行它们.
例如,我的输出可能是这样的:
UPDATE catalog_category_product SET position = 6040 WHERE (category_id = 156 AND product_id = 12648);
UPDATE catalog_product_entity_media_gallery_value SET label = 'Sandy Beach' WHERE ((store_id = 0) AND (value_id = 8791));
-- Done.
Run Code Online (Sandbox Code Playgroud)
我最近发现LinqPad有一个很好的类叫做Hyperlinq允许我编写这样的代码:
(new Hyperlinq(QueryLanguage.SQL, myGeneratedSqlText, "Run Query")).Dump();
Run Code Online (Sandbox Code Playgroud)
结果是将hyperlinq放在输出窗口中,该窗口将myGeneratedSqlText在新选项卡中运行查询(在我的示例中为内容)并执行查询.
这很方便.
但是,我现在希望能够保存已执行查询的日志.在LinqPad中手动执行"生成"查询似乎没有(一种简单的)内置方法.我当然可以Util.Run用来执行现有的已保存查询,实际上我做的是这样的:
Util
.OnDemand("Run Query", () =>
{
var fn = createOutputQueryFileName(); // Timestamped query name
System.IO.File.WriteAllText(fn, myGeneratedSqlText);
var run = Util.Run(fn, QueryResultFormat.Text);
var result = run.AsString();
return result.StartsWith("[]") ? "Success" : result;
})
.Dump();
Run Code Online (Sandbox Code Playgroud)
唯一的戏剧是我必须在文本前myGeneratedSqlText加上以下内容:
var preamble = @"<Query Kind=""SQL"">
<Connection>
<ID>ec026b74-8d58-4214-b603-6d3145e03d7e</ID>
<Driver Assembly=""IQDriver"" PublicKeyToken=""5b59726538a49684"">IQDriver.IQDriver</Driver>
<Provider>Devart.Data.MySql</Provider>
<CustomCxString>[DELETED]</CustomCxString>
<Server>127.0.0.1</Server>
<Database>prod_1_8</Database>
<Password>[DELETED]</Password>
<UserName>[DELETED]</UserName>
<NoPluralization>true</NoPluralization>
<NoCapitalization>true</NoCapitalization>
<DisplayName>Production Tunnel</DisplayName>
<EncryptCustomCxString>true</EncryptCustomCxString>
<Persist>true</Persist>
<DriverData>
<StripUnderscores>false</StripUnderscores>
<QuietenAllCaps>false</QuietenAllCaps>
<Port>6606</Port>
</DriverData>
</Connection>
</Query>
";
Run Code Online (Sandbox Code Playgroud)
我真的想避免所有这些序言的东西,并在我的Util.OnDemand(...)代码中包含这样的行:
var run = Util.Run(QueryLanguage.SQL, myGeneratedSqlText, QueryResultFormat.Text);
Run Code Online (Sandbox Code Playgroud)
(但这种方法不存在.)
此处的关键要求是在LinqPad输出窗口中显示hyperlinq,如果单击该窗口,则会将查询作为日志保存到磁盘并执行查询.
任何人都可以建议我干净利落的方式吗?
我希望我正确理解了你的意思。当您在顶部栏中选择连接时,您的 UserQuery 将成为数据上下文。因此,您可以在基于操作的 Hyperlinq 中对此使用 ExecuteQuery 和 ExecuteCommand。
new Hyperlinq(() => {
"do log work here".Dump();
this.ExecuteQuery<string>(generatedSelect).Dump("Results");
this.ExecuteCommand(generatedCommand).Dump("Results");
}, "Run Query").Dump();
Run Code Online (Sandbox Code Playgroud)
不幸的是,这会输出到当前选项卡,但希望这至少能让您完成大部分工作:)
这是它工作时的图像:

当您使用 MySQL 时,您可以通过以下连接属性进行操作:
new Hyperlinq(() => {
"do log work here".Dump();
using (var command = this.Connection.CreateCommand())
{
// Usual command logic here
}
}, "Run Query").Dump();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
832 次 |
| 最近记录: |