gpt4 book ai didi

c# - 以编程方式在 LinqPad 中执行类似 `Hyperlinq` 的查询

转载 作者:太空狗 更新时间:2023-10-29 21:53:56 26 4
gpt4 key购买 nike

我使用带有 MySQL IQ 驱动程序的 LinqPad 从 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.

我最近发现 LinqPad 有一个很好的类,叫做 Hyperlinq,它允许我写这样的代码:

(new Hyperlinq(QueryLanguage.SQL, myGeneratedSqlText, "Run Query")).Dump();

结果是在输出窗口中放置了一个 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();

唯一的问题是我必须在 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>
";

我真的很想避免所有这些序言内容,并在我的 Util.OnDemand(...) 代码中包含这样一行:

var run = Util.Run(QueryLanguage.SQL, myGeneratedSqlText, QueryResultFormat.Text);

(但是这个方法不存在。)

这里的关键要求是在 LinqPad 输出窗口中显示一个 hyperlinq,如果单击它,会将查询作为日志保存到磁盘并执行查询。

任何人都可以为我推荐一个干净的方法吗?

最佳答案

希望我没听错。当您在顶部栏中选择了一个连接时,您的 UserQuery 将成为一个数据上下文。为此,您可以在基于操作的 Hyperlinq 中对 this 使用 ExecuteQuery 和 ExecuteCommand。

new Hyperlinq(() => {
"do log work here".Dump();
this.ExecuteQuery<string>(generatedSelect).Dump("Results");
this.ExecuteCommand(generatedCommand).Dump("Results");
}, "Run Query").Dump();

不幸的是,这会输出到当前选项卡,但希望这至少能让您完成大部分工作:)

这是它工作时的图片:

Example

当您使用 MySQL 时,您可以通过 this 上的连接属性:

new Hyperlinq(() => {
"do log work here".Dump();
using (var command = this.Connection.CreateCommand())
{
// Usual command logic here
}
}, "Run Query").Dump();

关于c# - 以编程方式在 LinqPad 中执行类似 `Hyperlinq` 的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27007594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com