# 混合使用多语言并共享变量 混合使用多种语言(C#、F#、Powershell、SQL、KQL、Python、Html、JavaScript、JavaScript、Mermaind等语言),是多语言笔记的最大特性,并且支持各语言之间共享变量这一创新功能。 ## 语言及共享变量的支持情况 | 语言 | 变量共享 | | ---- | ---- | | C# | 支持 | | F# | 支持 | | PowerShell | 支持 | | JavaScript | 支持 | | SQL | 支持 | | KQL | 支持 | | Python | 支持 | | R | 支持 | | HTML | 不支持 | | Mermaid | 不支持 | ## 初始化 ```C# //全局初始化 #!import "./Base.ipynb" //共享 using Microsoft.DotNet.Interactive; using Microsoft.DotNet.Interactive.Commands; ``` ## 使用 SQL(SQLite为例) + 引用NuGet包 ```C# #r "nuget:Microsoft.DotNet.Interactive.SQLite,*-*" ``` + 连接 SQL内核(使用 `#!connect` 魔法命令) ```C# /* 简单使用 #!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语句操作数据库) ```C# #!sql-SQLiteSharedKernel --查询年龄最大的5名学生 SELECT * FROM Student order by Age Desc LIMIT 5; --查询学生总数 SELECT COUNT(*) AS Count FROM Student; ``` ## 使用 KQL(效果图) 因为环境比较难搭建,用效果图代替。 ![KQL效果](./assets/images/KQL_Samples.jpg) ## 使用 Raw Value Storage 使用value内核,可以方便的管理共享文本数据。 ```C# #!value --name SharedDataFromValueKernel --from-file ./shared/file/data.json ``` ## C# ### 一般使用 ```C# var student = new {Id=1, Name="张三",Age=18}; student.Display(); ``` ### 使用Value内核共享的变量 ```C# #!set --name fromSharedFileData --value @value:SharedDataFromValueKernel fromSharedFileData.Display(); ``` ### 共享变量 使用C#查询数据库中的数据,共享出来,给其它语言(F#、html、js等使用) ```C# #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(); { 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("Id"), Name = reader.GetFieldValue("Name"), Age = reader.GetFieldValue("Age"), }; SharedStudents.Add(user); } } sqlConnection.Close(); sqlConnection.Dispose(); } } //共享数据:默认SharedStudents已共享,其它语言引用即可 SharedStudents.Display(); ``` ## F# ### 简单示例 ```C# printfn "Hello World from F#" ``` ### 使用C#共享数据 ```C# #!set --value @csharp:SharedStudents --name SharedStudents SharedStudents ``` ## Powershell ```C# #!powershell Write-Host "hellow powershell" ``` ## 使用Python + 前提:系统要安装Python环境,推荐使用Anaconda安装,直接安装Python也可以 + 作用:使多语言笔记,直接支持 Python语言; + 连接到 Python 内核 ```C# 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 ```C# # 明确指定内核:优先级高于 "单元格选择的内核" #!pythonkernel2 #!set --value @csharp:SharedStudents --name SharedStudents print("你好,我是 Ployglot Notebooks 使用 Python语言内核,打印的内容!") ``` ## 在 Python 中使用C#共享变量 ```C# #!pythonkernel2 #!set --value @csharp:SharedStudents --name SharedStudents print(SharedStudents) ``` ## 使用 html ```C# 完整html文档

使用Html文档,当然也可以使用Html片断。注意:纯HTML不支持共享变量!

C#共享数据:学生表
编号 姓名 年龄
``` ## 使用 JavaScript + 简单使用 ```C# console.log("输出js日志"); ``` + 操作html ```C# //改变上面html中h2文本颜色:执行后上面看效果 document.getElementById("MyTitle").style.color = "red"; ``` + 使用C#共享数据,填充数据表格 ```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 ## 基本请求 ```C# ### 请求 京东 get https://www.jd.com ### 请求QQ get https://www.qq.com ``` + 高级请求(使用变量等) ```C# @host=https://www.qq.com get {{host}} ``` ## 使用 mermaind ```C# 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 } ``` ```C# stateDiagram-v2 state fork_state <> [*] --> fork_state fork_state --> State2 fork_state --> State3 state join_state <> State2 --> join_state State3 --> join_state join_state --> State4 State4 --> [*] ```