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

315 lines
8.3 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 混合使用多语言并共享变量
混合使用多种语言(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<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#
### 简单示例
```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#
<!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
+ 简单使用
```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>>
[*] --> fork_state
fork_state --> State2
fork_state --> State3
state join_state <<join>>
State2 --> join_state
State3 --> join_state
join_state --> State4
State4 --> [*]
```