以编程方式在LinqPad中执行类似"Hyperlinq"的查询

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,如果单击该窗口,则会将查询作为日志保存到磁盘并执行查询.

任何人都可以建议我干净利落的方式吗?

Ste*_*lis 2

我希望我正确理解了你的意思。当您在顶部栏中选择连接时,您的 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)