0%

目标: 使用pageant作为ssh链接的agent/bridge,做到只需在pageant启动时中输入一次passphrasse,精简WSL2 + Windows中所有ssh相关(ssh、git等)的认证流程。
本文假设ssh key已经正确生成。

阅读全文 »

新加blog的流程改变

  • 从:
    • 需要hexo本地环境-> 修改post -> hexo 生成+部署-> github pages
  • 到:
    • 修改post -> blog-src repo(private) -> github actions -> blog repo(public)

所以可以在github.dev上直接编辑,而无需配置hexo环境

GraphQL: A query language for your API

在开发常见的CRUD应用时,最长遇到的需求是对特定的几个实体进行增删改查,比较常见的方式是手写对应的CRUD逻辑,麻烦且重复,即使引入了EFCore这类ORM,本文介绍如何在常见的CRUD项目中集成GraphQL,减少我们手写重复相关逻辑的麻烦。

本文相关代码都在 https://github.com/Itoktsnhc/demo-graphql 中,为了简单起见,数据库使用SQLite。

阅读全文 »

当我们使用EF的时候,有时候需要到处理运行时才可以确定的排序规则字符串,例如
-Name,Type,-Age 这样的排序规则串代表按照Name降序,然后按照Type升序,最后按照Age倒序。可以使用 System.Linq.Dynamic.Core 来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Person //entity定义
{
public string Name { get; set; }
public int Age { get; set; }
public string Type { get; set; }
}
//query:IQueryable<T>; sortStr类似`-Name,Type,-Age`

//首先将IQueryable<T> 转换为 IOrderedQueryable<T>
var orderedQuery = query.OrderBy(_ => 0);

//获取类型的所有属性,映射为 (全大写)->原属性的字典
var props = typeof (Person)
.GetProperties()
.ToDictionary(s => s.Name.ToUpper(), s => s.Name);

//确定排序条件
var sorts = sortStr.Split(',', StringSplitOptions.RemoveEmptyEntries)
.Select(s =>
{
var tmp = s.Trim().ToUpper();
return (!tmp.StartsWith("-"), tmp.TrimStart('-'));
});

//按照可用的属性名
foreach(var (isAsc, sort) in sorts) {
if (props.TryGetValue(sort, out var propName))
{
orderedQuery = orderedQuery.ThenBy(propName + (isAsc ? " ASC" : " DESC"));
}
}
query = orderedQuery;