基础知识(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=,Name="department1",CreatedTime=DateTime.Now,Contact="",ContactUser="Tom"},
new Department(){ Id=,Name="department2",CreatedTime=DateTime.Now,Contact="",ContactUser="Jeffcky"},
new Department(){ Id=,Name="department3",CreatedTime=DateTime.Now,Contact="",ContactUser="Lily"},
new Department(){ Id=,Name="department4",CreatedTime=DateTime.Now,Contact="",ContactUser="Jim"},
new Department(){ Id=,Name="department5",CreatedTime=DateTime.Now,Contact="",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)) == );
dynamic关键字
上述实现是最原始的方式,当dynamic关键字出世之后,我们可以直接将集合中的object类型转换为dynamic动态对象,在运行时让编译器自己去计算,如此一来上述的实现可以更加简洁实现。
var changes = Change(deparments); var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).id == );
虽然上述利用dynamic关键字实现看似很简洁但是也有其缺点,类似于JavaScript中动态类型,它是区分大小写的,要是我们将id写成Id直接抛出异常,如下:
var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).Id == );
为了这样避免出错,而且我们还是需要有智能提示,那就老老实实写一个专门针对下拉列表的转换类,也未尝不可。
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.
基础知识(C#语法、数据库SQL Server)回顾与总结的更多相关文章
- 数据库SQL Server与C#中数据类型的对应关系
ylbtech- .NET-Basic:数据库SQL Server与C#中数据类型的对应关系 数据库SQL SServer与C#中数据类型的对应关系 1.A,返回顶部 数据库 C#程序 int int ...
- 数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接
前言 DataGrip:Jet Brains出品的一款数据库管理工具(没错,是Jet Brains出品,必属精品).DataGrip整合集成了当前主流数据库(如:SQL Server, MySQL, ...
- sql server ------创建本地数据库 SQL Server 排序规则
sql server完整复制数据库 sql server导入导出方法 SQL Server 排序规则
- java基础知识总结8(数据库篇1)
一. Oracle的安装(windowXP.win7.Linux)和卸载 1.1 Oracle的安装 1.1.1 在WindowsXP.Win7下安装 第一:解压win32_11gR2_databas ...
- 数据库 SQL Server 到 MySQL 迁移方法总结
最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移.因此迁移前进行了一些调查和总结.下面是一些 SQL Server 到 MySQL 的迁移方法. 1. 使用 SQLyog 迁移 ...
- 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别
SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...
- 本地数据库(sql server)插入一条新数据时,同步到服务器数据库
之前有个同学问我,本地数据库插入新数据时怎么同步到服务器上,当时我先想到是程序逻辑控制,作相应的处理. 但有时候我们程序不太好处理,那能不能从数据库入手呢,数据库不是有触发器(Trigger)吗,应该 ...
- 数据库——SQL SERVER Transact-SQL 程序设计
什么是Transact-SQL? 标准SQL不支持过程化控制, 不能完成复杂的功能.T-SQL是过程化SQL语言, 是SQL的扩展 增加了过程化语句 (变量,赋值,分支,循环...)是数据库服务器 ...
- 【数据库-SQL Server】IDispatch error #3092
使用msado15.tlh,链接Microsoft SQL Server,执行语法(syntax)的时候出现IDispatch error #3092的错误. 1.语法错误 (1)保证语法正确,有些数 ...
随机推荐
- Pycharm中的加载多个项目
使用Pycharm,总会创建几个项目文件,有时候又不想全部一个一个的打开,所以这时候需要一个项目共存的方法,现在说一下怎么项目共存. 中英文对照 英文:首先打开setting界面: 中文首先打开设置界 ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- hdu--5351--MZL's Border
表示看这篇博客后找到了思路: http://blog.csdn.net/queuelovestack/article/details/47291195 补充一下数据,方便观察规律 m LBorder ...
- Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
这个问题当然是找不到mysql的驱动类,可能是环境CLASSPATH有问题或者就是那个人没有加载jdbc的驱动.我在网上下载mysql-connector-java-5.0.8-bin.jar一个这个 ...
- [Noi2008]假面舞会
考试的时候果断放弃,cout<<"-1 -1"骗10分hhh... 这也是图上问题.注意题目意思: ①如果有多个点指向同一个点,那么他们属于同一类别. ②一个点看到的所 ...
- Java继承关系的父子类中相同的成员变量
最近又重温了一遍<java编程思想>,在看的过程中产生一个想法,java中继承关系的父子类,相同的方法会被重写,那相同的变量会怎样呢? 答案是变量没有重写之说,如果子类声明了跟父类一样的变 ...
- lsof命令详解
--转载 一般root用户才能执行lsof命令,普通用户可以看见/usr/sbin/lsof命令,但是普通用户执行会显示“permission denied” 我总结一下lsof指令的用法: lsof ...
- Oracle SQL优化[转]
Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...
- 001-Mono for android在vs2012中发布设置
详细讲解 :http://www.cr173.com/html/20099_1.html 这里是快速设置: 1,把Debug换成Release 这里是必须改的 2,点击工具选项 3, ...
- 使用ActionBarActivity或者RxAppCompatActivity或者AppCompatActivity闪退的问题
新建一个项目,Activity继承RxAppCompatActivity的时候,在页面跳转的时候会出现闪退的问题,一直都没有解决. 后面将两个父类全部改成activity,问题解决.但是有的时候必须使 ...