linq

编写高质量代码的50条黄金守则-Day 03(首选is或as而不是强制类型转换)

生来就可爱ヽ(ⅴ<●) 提交于 2020-08-17 23:28:10
本文由 比特飞 原创发布,欢迎大家踊跃转载。 转载请注明本文地址: https://www.byteflying.com/archives/6710 。 编写高质量代码的50条黄金守则-Day 03(首选is或as而不是强制类型转换),本文由比特飞原创发布,转载务必在文章开头附带链接: https://www.byteflying.com/archives/6710 该系列文章由比特飞原创发布,计划用半年时间写完全50篇文章,为大家提供编写高质量代码的一般准则。 1、概述 在 .net 中包含三种基本的类型转换,is 操作符转换,as 操作符转换,强制类型转换,这三种类型转换各有不同却又各有联系。使用不当,可能引发 NullPointerException 异常或 InvalidCastException 异常。本文将通过一些演示案例为大家一探究竟。 2、通过反编译查看IL,探究类型转换的本质 接下来,我们先来准备环境: namespace EffectiveCoding03 { public class Program { public class TypeBase { } public class TypeSub : TypeBase { } public class TypeThree { } public static void Main(string[] args) {

Expression<Func<TObject, bool>>与Func<TObject, bool>的区别

六月ゝ 毕业季﹏ 提交于 2020-08-17 20:09:28
Func<TObject, bool>是委托(delegate) Expression<Func<TObject, bool>>是表达式比如: Expression编译后就会变成delegate,才能运行。 Expression<Func<int, bool>> ex = x=>x < 100; Func<int, bool> func = ex.Compile(); 然后你就可以调用func: func(5) //-返回 true func(200) //- 返回 false 而表达式是不能直接调用的。 1 2 3 4 5 6 7 8 9 10 11 12 案例:不正确的查询代码造成的数据库全表查询。 //错误的代码 Func<QuestionFeed, bool > predicate = null ; if (type == 1) { predicate = f => f.FeedID == id && f.IsActive == true ; } else { predicate = f => f.FeedID == id; } //_questionFeedRepository.Entities的类型为IQueryable<QuestionFeed> _questionFeedRepository.Entities.Where(predicate);

C# 数据操作系列

末鹿安然 提交于 2020-08-17 18:11:17
0.前言 到目前为止,我们看了一下如何声明EF Core的初步使用,也整体的看了下EF Core的映射关系配置以及导航属性的配置。 这一篇,我带大家分享一下,我在工作中需要的EF Core的用法。 1. 初始化 在实际开发中,一般都是先设计好数据表再进行开发,所以很少用到EF Core的数据迁移功能。所以EF Core的初始化,一般也指的是EF Core上下文初始化。 1.1 连接字符串 我们通过前面的文章知道,EF Core在上下文初始化的时候,都需要一个链接字符串。如果在不考虑后续变更或者上下文的复用性,可以直接在自定义Context里重写OnConfiguring方法中定义。 如果需要后续变更,那么就需要在创建自定义EF Core 上下文类的时候,为之添加一个连接字符串的属性或者字段,以方便初始化的时候指定。实例: public class DefaultContext : DbContext { private string Connection { get; set; } = "Data Source=./blogging1.db"; public DefaultContext(string connection) { Connection = connection; } protected override void OnConfiguring

ASP.NET Web API Demo OwinSelfHost 自宿主 Swagger Swashbuckle 在线文档

大城市里の小女人 提交于 2020-08-17 17:26:51
新建Web API工程 选Empty,勾选Web API,不要选择Web API,那样会把MVC勾上,这里不需要MVC Web API工程属性 XML文件用于生成在线文档 新建Windows服务作为Web API的宿主 WebApiHost工程属性 控制台应用程序方便调试 Windows服务安装Microsoft.AspNet.WebApi.OwinSelfHost 工程WebApiDemo需要引用Microsoft.Owin.dll WebApiDemo安装Swashbuckle 应用程序入口 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks; namespace WebApiHost { static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> static void Main( string [] args) { RunDebug(); StartService(); } private static void

.net core grpc单元测试

一个人想着一个人 提交于 2020-08-17 16:23:56
.net core grpc单元测试 - 服务器端 前言 gRPC凭借其严谨的接口定义、高效的传输效率、多样的调用方式等优点,在微服务开发方面占据了一席之地。dotnet core正式支持gRPC也有一段时间了,官方文档也对如何使用gRPC进行了比较详细的说明,但是关于如何对gRPC的服务器和客户端进行单元测试,却没有描述。经过查阅官方代码,找到了一些解决方法,总结在此,供大家参考。 本文重点介绍gRPC服务器端代码的单元测试,包括普通调用、服务器端流、客户端流等调用方式的单元测试,另外,引入sqlite的内存数据库模式,对数据库相关操作进行测试。 准备gRPC服务端项目 使用dotnet new grpc命令创建一个gRPC服务器项目。 修改protos/greeter.proto, 添加两个接口方法: //服务器流 rpc SayHellos (HelloRequest) returns (stream HelloReply); //客户端流 rpc Sum (stream HelloRequest) returns (HelloReply); 在GreeterService中添加方法的实现: using System; using System.Collections.Generic; using System.Linq; using System.Threading

FreeSql (一)入门

狂风中的少年 提交于 2020-08-17 09:37:12
FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 所有运行平台。(QQ群:4336577) 模型 FreeSql 使用模型执行数据访问,模型由实体类表示数据库表或视图,用于查询和保存数据。 可从现有数据库生成实体模型,FreeSql 提供 IDbFirst 接口实现 生成实体模型 。 或者手动创建模型,基于模型创建或修改数据库,提供 ICodeFirst 同步结构的 API(甚至可以做到开发阶段自动同步)。 using FreeSql.DataAnnotations; using System; public class Blog { [Column(IsIdentity = true, IsPrimary = true)] public int BlogId { get; set; } public string Url { get; set; } public int Rating { get; set; } } 声明 dotnet add packages FreeSql.Provider.Sqlite static IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString

用过 mongodb 吧, 这三个大坑踩过吗?

别来无恙 提交于 2020-08-16 19:07:18
一:背景 1. 讲故事 前段时间有位朋友在微信群问,在向 mongodb 中插入的时间为啥取出来的时候少了 8 个小时,8 在时间处理上是一个非常敏感的数字,又吉利又是一个普适的话题,后来我想想初次使用 mongodb 的朋友一定还会遇到各种新坑,比如说: 插入的数据取不出来,看不爽的 ObjectID,时区不对等等,这篇就和大家一起聊一聊。 二: 1号坑 插进去的数据取不出来 1. 案例展示 这个问题是使用强类型操作 mongodb 你一定会遇到的问题,案例代码如下: class Program { static void Main(string[] args) { var client = new MongoClient("mongodb://192.168.1.128:27017"); var database = client.GetDatabase("school"); var table = database.GetCollection<Student>("student"); table.InsertOne(new Student() { StudentName = "hxc", Created = DateTime.Now }); var query = table.AsQueryable().ToList(); } } public class Student {

迭代器/枚举器/生成器的前世今生

馋奶兔 提交于 2020-08-16 14:26:28
一切为了抽象 一段代码越抽象它的 复用价值 就越高,举一个极端例子: function emptyAction(x) { return x } 上面这个函数就像数学里面的 f(x) = x 一样,与山河同在,与日月同辉! 比如可以使用它进行数组的复制: let a = [1, 2, 3] let aDuplicate = a.map(emptyAction) 比如可以玩我返回我自己,虽然我也不知道这有什么用: let one = emptyAction(emptyAction)(emptyAction)(1) 所以,为了不把那些 shiiiiit 代码再写一遍一遍又一遍,就抽象吧! 遍历高桌子,遍历低板凳 假设任何一组数据都永远使用 Array 存储,那么下面这段代码也是一段复用价值极高的代码: for (let i = 0; i < a.length; i++) { const element = a[i]; // do something } 尽管它并不直观,我才不想管 i 是什么 length 是什么,以及 daaaaamn a[i] 又是什么!我只想遍历数组中的每一个元素,给我数组中的元素,OK??? 而且事实上我们除了 Array,还有 Set、Map、LinkedList 以及 maaaaany kinds of Object,很不幸它们并不支持这样的写法

【asp.net core】7 实战之 数据访问层定义

佐手、 提交于 2020-08-16 07:17:57
0. 前言 在上一篇,我们搭建了一个项目框架,基本上是一个完整的项目。目前而言,大部分的应用基本都是这个结构。好的,不废话了,进入今天的议题:完成并实现数据层的基础实现。 1. 数据实体 通常情况下,一个项目的数据实体中字段并不是完全没有规律可寻。通常情况下,必须有一个主键。有些时候,会要求在数据表中增加上次修改时间和创建时间,以及创建人和修改人的主键。 所以,我们可以创建一个泛型父类,来帮我们定义这些公共字段: using System; namespace Data.Infrastructure { public class BaseEntity<T> { public T Id { get; set; } public string ModifyUserId { get; set; } public DateTime? ModifyTime { get; set; } public string CreatorId { get; set; } public DateTime? CreateTime { get; set; } } } 看上述代码里,命名空间并不在Data里,而是在Data.Infrastructure里。这个命名空间 Infrastructure 用来存放一些项目的架构类或者接口,里面还会其他的类。 那么,给这个类补充一些可能有用的方法: public

PCB Genesis或Incam 右键导入TGZ 实现方法

时光毁灭记忆、已成空白 提交于 2020-08-16 06:55:06
使用Genesis导入TGZ方式很多 的,比如有:写个脚本框选TGZ的的方式实现TGZ导入,将TGZ拖入脚本界面实现TGZ导入, 给Engineering Toolkit窗口句柄注册拖拽事件实现TGZ导入, 右键实现TGZ导入等,本篇介绍最后一种右键导入TGZ的方法. 一.实现效果图 1.tgz文件右键导入 2.tgz文件夹右键导入 二.借助Gateway实现InputTGZ脚本----C#实现代码 1.C#实现代码部份 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml.Serialization; namespace InputTGZ { static class Program { static Process process = new Process(); private static bool isIncam = false ; static string db_name = " genesis " ; //db名为默认值,满足个性化可以改为配置读取 /// <summary>