.NET

Squirrel Framework 查询入门 (1)

从 Squirrel Framework 1.0.15 起,我们拥有了 4 种 MongoDB / Cosmos DB 的查询形式,分别是 定制封装、Linq、Lambda 及 Mongo Database Object Command。今天我们通过一个最简单的例子,来介绍一下最常规的查询模式,体验 MongoDB 可以给我们带来的便捷。

如何获取并使用?


正式开始

假设我们在 MongoDB 或者 Microsoft Azure Cosmos DB 中有一个 TestDatabase,其中的 UserCollection 表中拥有许多的用户信息,我们希望得到:

在按照年龄从大到小排序的情况下,选取前三名,18 到 27 岁的老姑娘,并且英文名字中必须带字母 “h”。

啧啧。同时,由于我们每个 User 对象的数据都非常大,出于存储成本及数据传递成本的考虑,我只希望得到她们的中文名和联系电话。

如果我们在常规的 SQL 数据库中进行查询,只需编写如下 SQL 语句。


SELECT TOP 3 
  ChineseName AS Girl,
  MobilePhone AS Tel
FROM
  UserCollection
WHERE
  EnglishName LIKE "%h%"
  AND Gender = 1
  AND Age > 17
  AND Age < 28
ORDER BY
  Age DESC

那么对于 NoSQL 类型的 MongoDB 数据库,我们又该如何基于 Squirrel Framework 进行查询呢?这次我们以 1.0.15 版本最新的 Linq 方式进行查询。


        private dynamic LinqQuery()
        {
            var userCollection = this.userRepository.AsQueryable();
            var regex = new Regex("h", RegexOptions.IgnoreCase);

            var query = from u in userCollection
                        where regex.IsMatch(u.Name)
                                && u.Gender == false
                                && u.Age > 17
                                && u.Age < 28
                        orderby u.Age descending
                        select new { Girl = u.ChineseName, Tel = u.MobilePhone };

            return query.Take(3).ToList();
        }

        // Get the result
        var json = JsonHelper.Serialize(this.LinqQuery());


版本说明

如何将 .NET DateTime 转换为 JavaScript Date – 形如:\/Date(1539953962642)\/

前言

在使用 ASP.NET MVC 开发 Web 程序时,对于 DateTime 类型的数据在 JSON 结果中,以类似于 “\/Date(1539953962642)\/” 的形式进行返回,那么这里中格式叫做什么呢?其中的数字的意义如何?

实际上这种数据格式叫做 Microsoft’s built-in JSON Date format,这不是任何一个通用规范的一部分,它是微软定义的一种格式。并且这里的数字并不是 .NET DateTime 的 Ticks!实际上这个值就是 TimeInMillis!


Ticks 和 TimeInMillis 有什么区别?

Ticks 一般是指从 0001-01-01 00:00:00.000 到现在的百纳秒计数,这个计数单位是 100 nanosecond(long 类型存储),.NET 平台使用 Ticks 方式记录时间(比如 [C#] DateTime.UtcNow.Ticks)。

TimeInMillis 一般是指从 1970-01-01 00:00:00.000 到现在的毫秒数,这个单位是 1 millisecond(long 类型存储),Java 和 JavaScript 使用 TimeInMillis 方式记录时间(比如 [JavaScript] Date.now())

所以,我们只需要通过正则表达式提取这个 Microsoft’s built-in JSON Date format 的值,直接应用于 JavaScript 即可。
Continue reading

.NET Standard / Core 项目发布 NuGet 包并使包中的配置文件自动生成到 Bin 下

之前在如何创建 NuGet 包的文章中,曾经提到如何将配置文件(文件夹)包含到 NuGet 包中,并在用户安装了这个 NuGet 包并 build 自己工程后,自动将 Config 文件夹复制到 Bin 下。但是当时我并没有找到 .NET Standard 或 .NET Core 项目的配置方法,因此 Squirrel Framework 只能选择通过 .NET Framework 4.6.2 项目形式生成 NuGet 包(.NET Framework 下 NuGet 的配置方式请查看这篇文章《如何在 NuGet 发布自己的类库包》)。

不过最近有时间,通过半天的尝试终于将 4.6.2 的工程切换到 .NET Standard,这次的关键点在于不必自己去写 .nuspec 配置文件之后通过 dotnet pack 命令进行 build,而是改为直接通过编辑项目文件(.csproj)并通过 Visual Studio 在每次 build 时,自动完成 NuGet 包的生成。具体配置步骤如下:

Continue reading

Squirrel Framework 1.0.13 说明文档

Squirrel Framework – 是一个轻量级的 MongoDB 存储封装类库。同时,它还尝试为使用者提供了一系列的拓展类,方便日常的 .NET 开发需求。它致力于让你轻松、快速地构建基于 MongoDB 的应用程序。

下面我们简单介绍一下 Squirrel Framework 的核心功能,只要以下 4 个步骤,你就能完成持久化层的开发。

Continue reading

GitHub 提交忽略规则

我们可以在代码库的根目录创建一个名为 “.gitignore” 的文件,并在其中配置哪些文件或文件夹可以在提交的时候被忽略。以 .NET 项目为例,我们需要忽略与 VS 或 调试编译有关的 bin\obj\packages\.vs 等文件或文件夹,则只需要:

# Emacs backup files
*~

appsettings.local.json
local.settings.json
*.pfx


# The below are a selected subset from
# https://github.com/github/gitignore/blob/master/VisualStudio.gitignore


# Visual Studio user-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
*.dll
*.dll.config
*.exe
*.exe.config
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/

# Visual Studio 2015/2017 cache/options directory
.vs/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json

# Files built by Visual Studio
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# Visual Studio code coverage results
*.coverage
*.coveragexml

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

注意,按行配置约束,一行一个。

一键清除 .NET 无用文件,清爽一夏

工作几年,电脑里会有很多项目代码,随之而来的就是许许多多调试、编译时带来的 bin/obj/package 或者 .vs 文件(夹),如何清除这些文件,来一个大扫除呢?这里提供一个超有效的 Batch 脚本供参考。

@echo off
REM start to clean code folder
echo Start to clean all code folder

@for /d /r %%c in (obj) do @if exist "%%c" (@rd /s /q "%%c" & echo Delete %%c)
@for /d /r %%c in (bin) do @if exist "%%c" (@rd /s /q "%%c" & echo Delete %%c)
@for /d /r %%c in (packages) do @if exist "%%c" (@rd /s /q "%%c" & echo Delete %%c)
@for /d /r %%c in (.vs) do @if exist "%%c" (@rd /s /q "%%c" & echo Delete %%c)

echo Done.

存储为 .bat 文件后,通过命令提示符运行,在我的电脑上运行后,整整节约了 15G 的磁盘空间,泪流满面!

如何在 NuGet 发布自己的类库包

我们可以将自己实现的类库发布到 NuGet 上,方便在未来开发应用程序时,对已有代码或结构进行复用。以下是在 NuGet 发布自己类库的一个简单介绍。

1. 首先,我们需要到 nuget.org 注册并 获取 API key

2. 随后,下载 NuGet 命令行工具,建议将 nuget.exe 注册到系统的环境变量中,方便后续步骤的操作
Continue reading

最佳实践:根据条件获取集合的部分结果

很多场景下,我们需要根据一个条件判定某一集合中是否存在从中选取部分符合条件的元素用于后续操作。我们有很多方式可以实现这种需求,比如 纯手工对集合进行遍历,yield return,Any(),Count() 或 Count 属性,那么,这些实现方式对效率的影响如何?哪种实现效率较优呢?

我们来做一次实验。

首先我们定义一个类,并初始化包含有 1 万个该类型实例的集合。

    public class Item
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public bool Gender { get; set; }
        public int Age { get; set; }
        public DateTime Birthday { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
    }

Continue reading

如何将 XML 的 XSD 定义转换为 C# 类

当我们将一些配置数据存储在 XML 文档中,或希望自定义某种 XML 格式的文档时,最好先去定义 XML 对应的 XSD 规范。定义 XSD 后,我们不仅可以在 VS 等 IDE 中对相应的 XML 文件的语法进行自动检查或属性匹配,同时也可以自动生成对应的实体类,简化 XML 的创建、修改以及读取。

打开 VS,在 XSD 文件上点击鼠标右键,点选 Open Command Prompt

Continue reading