基础知识(C#语法、数据库SQL Server)回顾与总结

前言

已经有大概一个多月没有更新博客,可能是开始变得有点懒散了吧,有时候想写,但是又需要额外投入更多的时间去学习,感觉精力完全不够用啊,所以为了弥补这一个多月的潜水,决定写一篇,衔接9月未写博客的空缺。

无需定义实体,返回object类型,如何获取属性值?

这样的场景在下拉列表中很常见,在下拉列表中我们只需要Id和Name两个字段,无需其他字段,同时也是为了节约流量,例如实体和数据如下:

    public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedTime { get; set; }
        public string Contact { get; set; }
        public string ContactUser { get; set; }
    }
            var deparments = new List<Department>()
            {
                new Department(){ Id=1,Name="department1",CreatedTime=DateTime.Now,Contact="13682687787",ContactUser="Tom"},
                new Department(){ Id=2,Name="department2",CreatedTime=DateTime.Now,Contact="13682687788",ContactUser="Jeffcky"},
                new Department(){ Id=3,Name="department3",CreatedTime=DateTime.Now,Contact="13682687783",ContactUser="Lily"},
                new Department(){ Id=4,Name="department4",CreatedTime=DateTime.Now,Contact="13682687782",ContactUser="Jim"},
                new Department(){ Id=5,Name="department5",CreatedTime=DateTime.Now,Contact="13682687781",ContactUser="Allen"},
            };

此时为了再额外定义另外的实体,我们通过匿名类型来进行转换

        static IEnumerable<object> Change(List<Department> departments)
        {
            var changeDepartments = departments.Select(d => new
            {
                id = d.Id,
                name = d.Name
            });
            return changeDepartments;
        }

将上述集合传入到该Change方法中则返回集合中包含id和name的列,这样在下拉列表就能很好的显示,但是如果用户选择了所在部门,下一次再次进行编辑时需要在该转换集合中得到用户的id和name,此时集合返回类型为object,我们如何得到其中的属性id和用户id进行比对呢,我们来看看以下两种方法。

反射

反射应该是我们首先能够想到的方式了,获取该实体类型的属性并获取其值。例如我们要在上述Change方法返回的集合中获取到id=1的对象,我们通过如下反射来获取。

  var changes = Change(deparments);

  var specialDepartment = changes.FirstOrDefault(d => Convert.ToInt32(d.GetType().GetProperty("id").GetValue(d)) == 1);

dynamic关键字

上述实现是最原始的方式,当dynamic关键字出世之后,我们可以直接将集合中的object类型转换为dynamic动态对象,在运行时让编译器自己去计算,如此一来上述的实现可以更加简洁实现。

           var changes = Change(deparments);

            var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).id == 1);

虽然上述利用dynamic关键字实现看似很简洁但是也有其缺点,类似于JavaScript中动态类型,它是区分大小写的,要是我们将id写成Id直接抛出异常,如下:

  var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).Id == 1);

为了这样避免出错,而且我们还是需要有智能提示,那就老老实实写一个专门针对下拉列表的转换类,也未尝不可。

    public class SelectItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

数据排名

排名这个也是常见不能再常见的场景了,例如在微信运动中就有截止到每天到十点每天所走步数好友的排名,场景有几种对应的实现方式也有几种,我们来看看。建立如下简单示例表。

不同等分数排名

不同等分数即分数都不一样,如下

首先我们利用Row_Number()函数来实现排名。

SELECT UserId,Score,
    ROW_NUMBER() OVER(ORDER BY Score DESC) AS [Rank]
FROM dbo.Ranks

这样我们就可以获取到某个用户所在排名为多少,这只是针对没有同样的分数而言,要是分数有一样的呢,Row_Number函数还适用?

同等分数并列排名

我们将数据修改成如下:

再来利用Row_Number来进行排名。

此时分数同样为90则排名一个为第三名,另个却为第四名,用户表示我不服,分数不一样,而且没有其他维度的判断逻辑,怎么我就变成第四名了呢,不应该是并列第三名么。这是程序员小哥的bug。我不听,我不听。下面再来设计一个课程得分的表ExamResult。

并列分数排名又分为两种场景,比如上述学生Sam的数学和科学都是为90,则并列第一名,到了社会这门学科是第三名,还是第二名呢,这就看实际应用场景,若是第三名我们就需要用RANK函数来排名。

SELECT  Name ,
        Subject ,
        Marks ,
        RANK() OVER (PARTITION BY name ORDER BY Marks DESC ) Rank
FROM    ExamResult
ORDER BY name ,
        subject

若是没有空缺排名则利用DENSE_RANK函数来实现。

SELECT  Name ,
        Subject ,
        Marks ,
        DENSE_RANK() OVER ( PARTITION BY name ORDER BY Marks DESC ) Rank
FROM    ExamResult
ORDER BY name

由上我们知道关于SQL Server中RANK和DENSE_RANK函数的区别在于DENSE_RANK函数没有排名空缺。在大部分场景下都需要考虑并列排名的情况,其ROW_NUMBER函数不再适用,除非明确知道排名中不会存在分数并列的情况,否则谨慎适用。

删除数据重复

如果数据库表设计不够合理,或者说出现并发很容易导致插入重复情况,此时我们去尝试删除数据重复的表。我们首先创建如下测试表。

 CREATE TABLE DuplicateRows
    (
      Id INT ,
      Name VARCHAR(20)
    )

 INSERT INTO DuplicateRows
 VALUES ( 1, ‘Andy‘ )
 INSERT INTO DuplicateRows
 VALUES ( 1, ‘Andy‘ )
 INSERT INTO DuplicateRows
 VALUES ( 2, ‘Bill‘ )
 INSERT INTO DuplicateRows
 VALUES ( 2, ‘Bill‘ )
 INSERT INTO DuplicateRows
 VALUES ( 2, ‘Bill‘ )
 INSERT INTO DuplicateRows
 VALUES ( 3, ‘Chris‘ )

我们看到如上数据Name为Andy的数据重复两次,同时Name为Bill的数据重复三次。关于数据重复删除方式总结起来有四种方式,我们一起来总结下。

借助临时表(方式一)

SELECT DISTINCT
        *
INTO    #tmp
FROM    [dbo].[DuplicateRows]
DELETE  FROM [dbo].[DuplicateRows]
INSERT  INTO [dbo].[DuplicateRows]
        SELECT  *
        FROM    #tmp
DROP TABLE #tmp

上述逻辑很简单,我们查询出不重复的删除并插入到临时表中,然后删除表中数据将临时表中不重复的数据插入到表中即可。

RANK() OVER( PARTITION BY)(方式二)

上述是最简单的方式,若是我们表中有一列和另外一行列不同,此时利用DISTINCT关键字过滤数据将不再起作用。在这种情况下,我们可以添加一列,作为行唯一标识符(自动递增升序)。然后获取每个Id的名称。 如果Rank大于1,则表示它是重复行然后删除。 删除重复的行后,删除唯一列标识。 如下:

添加唯一标识列且自增长。

  ALTER TABLE [dbo].[DuplicateRows] ADD  sNo INT IDENTITY(1,1)

利用RANK函数对名称进行分区并进行sNo排序。

  SELECT    * ,
            RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo ) [rank]
  FROM      [dbo].[DuplicateRows]
 

此时再删除rank大于1即重复的数据。

 DELETE E
 FROM   [dbo].[DuplicateRows] E
        INNER JOIN ( SELECT * ,
                            RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo DESC ) [rank]
                     FROM   [dbo].[DuplicateRows]
                   ) T ON E.sno = t.sno
 WHERE  T.[rank] > 1

最后删除唯一标识列sNo.

 ALTER TABLE [dbo].[DuplicateRows]
 DROP  COLUMN sNo

完整代码如下:

  ALTER TABLE [dbo].[DuplicateRows] ADD  sNo INT IDENTITY(1,1)

  DELETE    E
  FROM      [dbo].[DuplicateRows] E
            INNER JOIN ( SELECT * ,
                                RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo DESC ) [rank]
                         FROM   [dbo].[DuplicateRows]
                       ) T ON E.sno = t.sno
  WHERE     T.[rank] > 1

  ALTER TABLE [dbo].[DuplicateRows]
  DROP  COLUMN sNo

DELELTE TOP(2)(方式三)

如果我们想删除特定重复的数据,通过DELETE TOP语句来完成,例如删除上述id = 2的重复数据。

 DELETE TOP ( 2 )
 FROM   [dbo].[DuplicateRows]
 WHERE  Id = 2

HAVING COUNT(*) >1(方式四)

如果我们需要将所有重复的数据都删除,只保留未被删除的数据,利用HAVING COUNT(*) >1完成,若是查询到重复个数大于1则删除。

   DELETE   FROM [dbo].[DuplicateRows]
   WHERE    Id IN ( SELECT  Id
                    FROM    [dbo].[DuplicateRows]
                    GROUP BY Id
                    HAVING  COUNT(*) > 1 )

上述讲到了删除数据重复的四种方式,若是需要查询并过滤数据重复情况,举一反三同样大部分也适用。

总结

本节讲述一点基础知识,回顾了一下,十一期间有时间会讲讲vue。see u.

时间: 2024-08-03 09:14:07

基础知识(C#语法、数据库SQL Server)回顾与总结的相关文章

SQL SERVER 基础知识及语法总结,从头说起,一点一滴 (一)

什么是SQL? SQL指结构化查询语言 SQL使我们有能力访问数据库 SQL是一种ANSI的标准计算机语言 在SQL的使用上,或多或少也有许多知识点,在这里总结一下关于SQL的基本语法以及一些基础知识点 前      言 首先来谈谈对数据库以及服务器的一些愚见吧! 项目按照类型分大致可以划分为C/S以及B/S方式,前者是客户端/服务器的方式,后者是网页浏览器/服务器的方式,无论哪一种方式都是由前端客户端发送请求数据包给服务器上的应用服务器对数据库进行处理再返回处理结果而实现的,在后台的数据库按照

【转载:Oracle基础知识】Oracle数据库体系结构

先来看张直观的图:                                            oracle 11g 体系结构图 理解Oracle体系结构要充分理解三个概念:数据库(database),数据库实例(instance),会话(session),一定不要把这三个概念弄混. 数据库的概念 (A)    物理存储结构由数据文件.控制文件.重做日志文件组成: 1.       数据文件(datafile) select * from dba_data_files; 数据文件包括存

数据库基础知识总结(MS sql)

基本概念 数据:描述事物的符号称为数据,是存储在数据库中的基本对象. 数据库:数据库是长期存储在计算机上内的有组织.可共享的数据集合. 数据库管理系统:用户和操作系统之间的一层数据管理软件.主要功能包括如下几个方面: >1 数据定义功能:通过数据定义语言DDL(Data Definition Language)实现数据对象的定义 >2 数据组织.存储和管理 >3 数据操纵:通过数据操纵语言DML(Data Manipulation Language),用户可以使用DML操纵数据,实现对数

java基础知识总结8(数据库篇1)

一. Oracle的安装(windowXP.win7.Linux)和卸载 1.1 Oracle的安装 1.1.1 在WindowsXP.Win7下安装 第一:解压win32_11gR2_database_1of2.win32_11gR2_database_2of2,生成detabase目录 第二:安装oracle A.点击setup图标即可,注意:安装目录不要含有中文 B.在弹出的第一个界面中取消更新选择项,点击下一步 C.在弹出的警告框中选择是 D.选择创建和配置数据库选项,下一步 E.选择桌

数据库 SQL Server 到 MySQL 迁移方法总结

最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移.因此迁移前进行了一些调查和总结.下面是一些 SQL Server 到 MySQL 的迁移方法. 1. 使用 SQLyog 迁移 具体方法可以参加:http://www.cnblogs.com/gaizai/p/3237907.html 优点:该迁移方法很简单,灵活,迁移时,可以进行字段的修改,比如在sql server中原来是datetime,然后迁移到mysql时你可以配置成timestamp: 成功率很高: 缺点:迁移很

数据库设计:数据库SQL SERVER设计的一些注意点

1.每个表的逐渐是对象+ID,主键+自动递增.不用GUID. 2.每个表添加4个追踪字段:InsertDate,InsertUserID,添加时间和添加人,UpdateDate,UpdateUserID最后一次更新的时间和更新人,共四个字段.如果确定用SQL SERVER,则这样命名可.如果是一个产品,为了支持多个数据库,还是分开来好,比如:insert_date 全部小写,这样命名也是一种好的选择,统一起来即可.如果是我做的话,在SQL SERVER数据库,我还是倾向于按照大小写来命名,Ora

WPF学习(一):第一个WPF程序(包含数据库sql server 2008)

既然WPF是当下最高级的windows平台GUI技术,为了方便的写点儿小程序,学习一下还是必要的. 首先先找个教程一步一步做,于是就百度到了这个WPF入门教程系列(一).貌似这个教程只有第一期啊,不管这个,先做就是了. 一开始想安装vs2013社区版,无奈电脑是盗版的WIN7,非sp1,更新sp1也不成功,就装了vs2010,还能用吧. 下面就开始了. 首先打开vs,创建c#程序,选择WPF,这都不用多说.按照WPF入门教程系列(一)做就可以了,直到 WPF后台逻辑代码编写 这一步.由于没有学过

[数据库]SQL Server 2008 如何查看与创建约束

SQL Server中有五种约束类型,分别是 PRIMARY KEY约束.FOREIGN KEY约束.UNIQUE约束.DEFAULT约束.和CHECK约束.查看或者创建约束都要使用到 Microsoft SQL Server Managment Studio. 1. PRIMARY KEY约束 在表中常有一列或多列的组合,其值能唯一标识表中的每一行.这样的一列或多列成为表的主键(Primary Key).一个表只能有一个主键,而且主键约束中的列不能为空值. 查看PRIMARY KEY约束可以在

如何分离数据库 (SQL Server Management Studio)

在 SQL Server Management Studio 对象资源管理器中,连接到 SQL Server 数据库引擎的实例上,再展开该实例. 展开“数据库”,并选择要分离的用户数据库的名称. 分离数据库需要对数据库具有独占访问权限.如果数据库正在使用,则限制为只允许单个用户进行访问: 右键单击数据库名称并指向“属性”. 在“选择页”窗格中,选择“选项”. 在“其他选项”窗格中,向下滚动到“状态”选项. 选择“限制访问”选项,然后在其下拉列表中,选择“单用户”. 单击“确定”. 将出现一个消息