You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PolyglotNotebooksStudy/Docs/多语言笔记.1.3.混合使用多种语言.md

8.3 KiB

混合使用多语言并共享变量

混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。

语言及共享变量的支持情况

语言 变量共享
C# 支持
F# 支持
PowerShell 支持
JavaScript 支持
SQL 支持
KQL 支持
Python 支持
R 支持
HTML 不支持
Mermaid 不支持

初始化

//全局初始化
#!import "./Base.ipynb"

//共享
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;

使用 SQL(SQLite为例)

  • 引用NuGet包
#r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*"
  • 连接 SQL内核(使用 #!connect 魔法命令)
/*  简单使用

    #!connect sqlite --kernel-name SQLiteSharedKernel --connection-string "Data Source=.\assets\database\study.db;"
*/

//优化方法
using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;
{
    //内核名:魔法命令中的内核名,执行后会自动加 sql- 前缀,做为内核名被使用
    string magicCommandKernelName =  "SQLiteSharedKernel";
    string completeKernelName = "sql-" + magicCommandKernelName;

    //引入内核:可重复执行
    if(Microsoft.DotNet.Interactive.Kernel.Root.FindKernelByName(completeKernelName) == null)
    {
        var connectKernelCode = $"#!connect sqlite --kernel-name {magicCommandKernelName} --connection-string \"{SharedDbConnect.SQLiteConnectionString}\"";
        await Kernel.Root.SendAsync(new SubmitCode( connectKernelCode,  "csharp"));
    }
    else
    {
        Console.WriteLine($"名为 {completeKernelName} 的内核已存在。需要新内核时,请为--kernel-name参数使用不同的值, 本次执行不做任何更改!");
    }
}
  • 使用SQL内核(SQL语句操作数据库)
#!sql-SQLiteSharedKernel

--查询年龄最大的5名学生
SELECT * FROM Student order by Age Desc LIMIT 5;

--查询学生总数
SELECT COUNT(*) AS Count FROM Student;

使用 KQL(效果图)

因为环境比较难搭建,用效果图代替。

KQL效果

使用 Raw Value Storage

使用value内核可以方便的管理共享文本数据。

#!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json

C#

一般使用

var student = new {Id=1, Name="张三",Age=18};
student.Display();

使用Value内核共享的变量

#!set --name fromSharedFileData --value @value:SharedDataFromValueKernel

fromSharedFileData.Display();

共享变量

使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用)

#r "nuget:Microsoft.Data.SqlClient"
#r "nuget:Microsoft.Data.Sqlite"

using System.Data;
using System.Data.Common;
using System.Data.SqlTypes;

using Microsoft.Data.SqlClient;
using Microsoft.Data.Sqlite;

//使用 Ado.Net 从SQLite中获取数据再共享出去

//查询数据
var SharedStudents = new List<Student>();
{
    DataSet ds = new DataSet();
    using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))
    {
        sqlConnection.Open();
        
        var querySql = 
        """
            SELECT * FROM Student LIMIT 5;
        """;
        var cmd = sqlConnection.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = querySql;

        using (var reader = await cmd.ExecuteReaderAsync())
        {
            //循环输出行数据
            while (await reader.ReadAsync())
            {
                var user = new Student()
                {
                    Id = reader.GetFieldValue<int>("Id"),
                    Name = reader.GetFieldValue<string>("Name"),
                    Age = reader.GetFieldValue<int>("Age"),
                };

                SharedStudents.Add(user);
            }
        }

        sqlConnection.Close();
        sqlConnection.Dispose();
    }
}

//共享数据:默认SharedStudents已共享其它语言引用即可
SharedStudents.Display();

F#

简单示例

printfn "Hello World from F#"

使用C#共享数据

#!set --value @csharp:SharedStudents --name SharedStudents

SharedStudents

Powershell

#!powershell
Write-Host "hellow powershell"

使用Python

  • 前提系统要安装Python环境推荐使用Anaconda安装直接安装Python也可以

  • 作用:使多语言笔记,直接支持 Python语言

  • 连接到 Python 内核

using Microsoft.DotNet.Interactive;
using Microsoft.DotNet.Interactive.Commands;

//引入Python内核使用C# 执行引入语句
if(Kernel.Root.FindKernelByName("pythonkernel2") == null)
{
    //Console.WriteLine("正在导入Python内核....");
    var importPythonkernel = "#!connect jupyter --kernel-name pythonkernel2 --kernel-spec python3";
    await Kernel.Root.SendAsync(new SubmitCode( importPythonkernel,  "csharp"));
    Console.WriteLine("Python内核导入完成");
}
else 
{
    Console.WriteLine("Python内核已经导入");
}
  • 使用 Python
# 明确指定内核:优先级高于 "单元格选择的内核"
#!pythonkernel2

#!set --value @csharp:SharedStudents --name SharedStudents

print("你好,我是 Ployglot Notebooks 使用 Python语言内核打印的内容")

在 Python 中使用C#共享变量

#!pythonkernel2

#!set --value @csharp:SharedStudents --name SharedStudents
print(SharedStudents)

使用 html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>完整html文档</title>
</head>
<body>
    <div style="color:green">
        <h2 id="MyTitle">使用Html文档,当然也可以使用Html片断。注意:纯HTML不支持共享变量!</h2>

        <table id="student" border="1" style="color:#fff">
        <caption>C#共享数据:学生表</caption>
        <thead>
            <tr>
                <th>编号</th>
                <th>姓名</th>
                <th>年龄</th>
            </tr>
        </thead>
       <tbody>
       </tbody>
    </table>
    </div>
</body>
</html>

使用 JavaScript

  • 简单使用
console.log("输出js日志");
  • 操作html
//改变上面html中h2文本颜色执行后上面看效果
document.getElementById("MyTitle").style.color = "red";
  • 使用C#共享数据,填充数据表格
#!set --value @csharp:SharedStudents --name SharedStudentsInJs

// 获取表格的tbody部分
const tableBody = document.querySelector('#student tbody');

// 遍历数据数组
SharedStudentsInJs.forEach(item => {
    // 创建一行
    const row = document.createElement('tr');

    // 创建单元格并填入数据
    const nameCell = document.createElement('td');
    nameCell.textContent = item.Id;
    row.appendChild(nameCell);

    const ageCell = document.createElement('td');
    ageCell.textContent = item.Name;
    row.appendChild(ageCell);

    const jobCell = document.createElement('td');
    jobCell.textContent = item.Age;
    row.appendChild(jobCell);

    // 将该行添加到表格的tbody中
    tableBody.appendChild(row);
});

HTTP Request

基本请求

### 请求 京东
get  https://www.jd.com

### 请求QQ
get https://www.qq.com
  • 高级请求(使用变量等)
@host=https://www.qq.com

get {{host}}

使用 mermaind

stateDiagram-v2
    [*] --> Active

    state Active {
        [*] --> NumLockOff
        NumLockOff --> NumLockOn : EvNumLockPressed
        NumLockOn --> NumLockOff : EvNumLockPressed
        --
        [*] --> CapsLockOff
        CapsLockOff --> CapsLockOn : EvCapsLockPressed
        CapsLockOn --> CapsLockOff : EvCapsLockPressed
        --
        [*] --> ScrollLockOff
        ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
        ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
    }

stateDiagram-v2
state fork_state <<fork>>
  [*] --> fork_state
  fork_state --> State2
  fork_state --> State3

  state join_state <<join>>
  State2 --> join_state
  State3 --> join_state
  join_state --> State4
  State4 --> [*]