1,146 次浏览

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());


版本说明

2,221 次浏览

JavaScript: HTML 内容折叠 (Html Content Ellipsis)

2018 年马上就要过去了,这一年真的经历了太多,本应该按惯例写写年终总结的,不过最近真的太忙了,总有些事情是更优先的,又赶上今天有人需要帮忙,索性就把解决这个小问题的代码讲一讲,全当作是对 2018 年的一个告别吧。

其实很久以前,在某个项目中也遇到过这个问题,我们在一个前端 Table (Grid) 中,希望显示出一个包含了 HTML 样式的富文本内容列,但是其内容很长,我们希望可以按照一个指定的字数进行截取(需要继续保留富文本的样式),并将字符串的剩余部分显示为 …

我们知道,通过 CSS ellipsis 也能设置 … 样式,但是这只能按照外围容器的 width 进行设定,无法按照字数进行处理。所以,为了庆祝新年,我们自己动手写一个吧!

Continue reading

34 次浏览
15 次浏览
71 次浏览
49 次浏览
59 次浏览
98 次浏览
113 次浏览

获取项目中全部 NuGet 包以及对应的 License

我们在日常 .NET Core 项目开发的过程中,经常需要获得整个解决方案中所有项目所引用的 NuGet 包的列表、对应的 License,甚至有时候出于法律的考量,我们需要检查 NuGet 包中所有递归引用的内部包的 License。

如果我们手动进行检查,工作量是巨大的,因此我编写了一个 PowerShell 脚本,来自动化完成这个工作。

基本原理

首先,基于 dotnet 命令自带的 list package 方法,及 –include-transitive 参数,来获取全部包引用的列表。
随后,通过 WebClient 下载对应的 License 文件。

使用方法

将 .ps1 文件放置到项目解决方案文件 (.sln) 所在位置并运行即可。

*

In the process of daily .NET Core project development, we often need to obtain a list of NuGet packages referenced by all projects in the solution, corresponding licenses, and sometimes for legal considerations, we need to check all licenses of recursion internal packages in each directly referenced NuGet packages.

If we check it manually, the workload is huge, so I wrote a PowerShell script to automate this task.

Fundamental

It’s based on the list package method that comes with the dotnet command, and the –include-transitive parameter, to obtain a list of all package references. And then, download the corresponding license file through WebClient.

Instructions

Place the .ps1 file in the location of the project solution file (.sln) and run it.

*

# Place the file to .sln folder, and run

dotnet list package --include-transitive > NuGetPackageList.txt

mkdir ".\licenses" > nul 2> nul
echo "Package ID,Package Version,Package Spec URL,License URL" > LicenseList.csv

Select-String "(>)\s+(\S+)\s+(\S+)\s+(\S+)*" NuGetPackageList.txt  |  Select @{Name="Id"; Expression = {$_.Matches.Groups[2]}}, @{Name="Version"; Expression = {$_.Matches.Groups[3]}}  |  Sort-Object -Property @{Expression="Id"; Descending=$false}, @{Expression="Version"; Descending=$false} -unique | % {

    $packageId = $_.Id;
    $packageIdLowerCase = $packageId.ToString().ToLower();
    $packageVersion = $_.Version;
    $packageSpecUrl = "https://api.nuget.org/v3-flatcontainer/$packageIdLowerCase/$packageVersion/$packageIdLowerCase.nuspec"

    Write-Host
    Write-Host("o> $packageId")
    Write-Host("  $packageVersion`n  $packageSpecUrl") -ForegroundColor Green 

    Try {  
        # Refer to https://docs.microsoft.com/en-us/nuget/api/package-base-address-resource#download-package-manifest-nuspec
        $packageSpec = (New-Object System.Net.WebClient).DownloadString($packageSpecUrl);
        $packageLicenseUrl = $packageSpec.package.metadata.licenseUrl;

        Write-Host("  $packageLicenseUrl") -ForegroundColor Green 
        echo "$packageId,$packageVersion,$packageSpecUrl,$packageLicenseUrl" >> LicenseList.csv
        
        Try {
            $filePath = (Join-Path (pwd) 'licenses\') + "$packageId.$packageVersion.txt";
            (New-Object System.Net.WebClient).DownloadFile($packageLicenseUrl, $filePath);
        }
        Catch [system.exception] {
            # Write-Host ($error[0].Exception);
            Write-Host ("!!> Could not download license file for $packageId $packageVersion") -ForegroundColor DarkMagenta
        }
    }
    Catch [system.exception] {
        # Write-Host ($error[0].Exception);
        Write-Host ("!!> Could not read license for $packageId $packageVersion") -ForegroundColor Red
        echo "$packageId,$packageVersion,$packageSpecUrl,(none)" >> LicenseList.csv
    }

}
95 次浏览