C#学习日记4

2022-07-29,

1.LINQ强制执行
解析:要强制立即执行任何查询并缓存其结果,可调用ToList或ToArray方法。如下所示:

List<int> numQuery2 = (from num in numbers where (num % 2) == 0 select num).ToList();
var numQuery3 = (from num in numbers where (num % 2) == 0 select num).ToArray();

2.查询关键字
解析:
[1]from:指定数据源和范围变量[类似于迭代变量]。
[2]where:基于由逻辑AND和OR运算符[&&或||]分隔的一个或多个布尔表达式筛选源元素。
[3]select:指定执行查询时,所返回序列中元素的类型和形状。
[4]group:根据指定的密钥值对查询结果分组。
[5]into:提供可作为对join、group或select子句结果引用的标识符。
[6]orderby:根据元素类型的默认比较器对查询结果进行升序或降序排序。
[7]join:基于两个指定匹配条件间的相等比较而联接两个数据源。
[8]let:引入范围变量,在查询表达式中存储子表达式结果。
[9]in:join子句中的上下文关键字。
[10]on:join子句中的上下文关键字。
[11]equals:join子句中的上下文关键字。
[12]by:group子句中的上下文关键字。
[13]ascending:orderby子句中的上下文关键字。
[14]descending:orderby子句中的上下文关键字。

3.标准查询运算符
解析:
[1]对数据进行排序
[2]集运算
[3]筛选数据
[4]限定符运算
[5]投影运算
[6]数据分区
[7]联接运算
[8]数据分组
[9]生成运算
[10]相等运算
[11]元素运算
[12]转换数据类型
[13]串联运算
[14]聚合运算

4.Dispose()方法
解析:释放由System.ComponentModel.Component使用的所有资源。

5.System.Data命名空间
解析:System.Data命名空间提供对表示ADO.NET结构的类的访问。通过ADO.NET,可以生成可有效管理多个数据源的数据的组件。
[1]DataSet:表示数据的内存中缓存。DataTable:表示内存中数据的一个表。
[2]ADO.NET结构的核心是DataSet类。每个DataSet都可以包含多个DataTable对象,而每个DataTable都包含单个数据源[比如SQL Server]的数据。
[3]通过使用System.Data.SqlClient命名空间[用于SQL Server的.NET Framework数据提供程序]
[4]System.Data.Odbc命名空间[用ODBC的.NET Framework数据提供程序]、System.Data.OleDb命名空间[用于OLE DB的.NET Framework数据提供程序]或System.Data.OracleClient命名空间[用于Oracle的.NET Framework数据提供程序],可以访问数据源从而用于DataSet。
[5]Each.NET Framework数据提供程序都有一个相应DataAdapter用作数据源之间的桥梁和DataSet。

6.connectingStrings读写操作
解析:ConnectionStrings最主要用于数据库连接,IP地址和端口号等。如下所示:

<connectionStrings>
	<add name="sbd" connectionString="Data Source=localhost;port=3306;Initial Catalog=sbd;uid=root;pwd=root;SslMode=none;" providerName="MySql.Data.MySqlClient" />
</connectionStrings>

说明:AppSettings主要用于应用程中的一些配置信息,比如上传文件路径等。

7.SqlConnection
解析:
[1]常用属性

ConnectionString:获取或设置用于打开SQL Server数据库的字符串。
ConnectionTimeout:获取在尝试建立连接时终止尝试并生成错误之前所等待的时间。 
Database:获取当前数据库或连接打开后要使用的数据库的名称。 
DataSource:获取要连接的SQL Server实例的名称。 
PacketSize:用来与SQL Server的实例进行通信的网络数据包的大小,以字节为单位。
ServerVersion:获取包含客户端连接的SQL Server实例的版本的字符串。 
State:指示最近在连接上执行网络操作时,SqlConnection的状态。 
StatisticsEnabled:如果设置为true,则对当前连接启用统计信息收集。
WorkstationId:获取标识数据库客户端的一个字符串。

[2]常用方法

Open():打开连接
Close():关闭连接
CreateCommand():创建SqlCommand对象
GetSchema():获取数据库架构信息

说明:System.Data.CommandType.StoredProcedure指定如何解释命令字符串。

8.关于winform的appconfig读写操作
解析:

Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);

9.SqlDataAdapter
解析:
[1]sqlDataadapter的作用是实现Dataset和DB之间的桥梁,比如将对DataSet的修改更新到数据库。如果只需要执行SQL语句或SP,就没必要用到DataAdapter,直接用SqlCommand的Execute系列方法就可以。
[2]SqlDataAdapter的UpdateCommand的执行机制是:当调用SqlDataAdapter.Update()时,检查DataSet中的所有行,然后对每一个修改过的Row执行SqlDataAdapter.UpdateCommand,也就是说如果未修改DataSet中的数据,SqlDataAdapter.UpdateCommand不会执行。
SqlDataAdapter属性、方法和事件,如下所示:
[1]属性

①AcceptChangeDuringFill:确定由DataAdapter所获取的行的RowState[默认为True]。
②DeleteCommand:获取或设置一个Transact-SQL语句或存储过程,以从数据集删除记录。
③InsertCommand:获取或设置一个Transact-SQL语句或存储过程,以在数据源中插入新记录。
④SelectCommand:获取或设置一个Transact-SQL语句或存储过程,用于在数据源中选择记录。
⑤UpdateCommand:获取或设置一个Transact-SQL语句或存储过程,用于更新数据源中的记录。
⑥TableMappings:SqlDataAdapter用来将查询的结果映射到DataSet的信息集合。
⑦ContinueUpdate:控制SqlDataAdapter在遇到一个错误之后是否继续提交更改[默认为false]

[2]方法

①Fill:执行存储于SelectCommand中的查询,并将结果存储在DataTable中。
②FillSchema:为存储在SelectCommand中存储的查询获取架构信息。获取查询中的各列名称和数据类型。
③GetFillParameters:为SelectCommand获取一个包含着参数的数组。
④Update:向数据库提交存储在DataSet[或DataTable、DataRows]中的更改。该方法会返回一个整数值,其中包含着在数据存储中成功更新的行数。

[3]事件

①FillError:当DataAdapter遇到填充DataSet或DataTable的一个错误时,该事件被触发。
②RowUpdated:向数据库提交一个修改的行之后被触发。
③RowUpdating:向数据库提交一个修改的行之前被触发。

10.SqlCommand方法
解析:

[1]BeginExecuteNonQuery:启动此SqlCommand描述的Transact-sql语句或存储过程的异步执行,通常执行INSERT、DELETE、UPDATE和SET语句等命令。对BeginExecuteNonQuery的每个调用必须与完成操作的EndExecuteNonQuery配对,通常在单独的线程上完成。
[2]BeginExecuteReader:启动此SqlCommand描述的Transact-sql语句或存储过程的异步执行,并从服务器中检索一个或多个结果集。对BeginExecuteReader的每个调用必须与完成操作的EndExecuteReader配对,通常在单独的线程上完成。
[3]BeginExecuteXmlReader:启动此SqlCommand描述的Transact-SQL语句或存储过程的异步执行。对BeginExecuteXmlReader的每个调用都必须与对EndExecuteXmlReader的调用配对,后者通常在单独的线程上完成操作,并返回XmlReader对象。
[4]ExecuteReader:执行返回行的命令。为了提高性能,ExecuteReader使用Transact-sqlsp_executesql系统存储过程来调用命令。因此,ExecuteReader可能不会产生所需的效果,因为用于执行Transact-sql SET语句等命令。
[5]ExecuteNonQuery:执行Transact-sqlINSERT、DELETE、UPDATE和SET语句等命令。
[6]ExecuteScalar:从数据库中检索单个值[例如聚合值][7]ExecuteXmlReader:将CommandText发送到Connection,并生成一个XmlReader对象。

11.语言集成查询和链式方法查询
解析:

[1]var query = from r in students where r.score < 60 orderby r.score select r;
[2]var query2= students.Where(r => r.score < 60).OrderBy(r => r.score).Select(r => r);

12.Queryable所有扩展方法
解析:
[1]Aggregate:为集合的元素应用一个累加器,可以指定累加器的实现。
[2]All:判断是否集合中所有元素都满足给定的条件。
[3]Any:判断是否集合中存在一个元素满足给定条件或者是否存在元素。
[4]Append:在集合的尾部添加元素。
[5]AsQueryable:将一个IEnumerable转化为IQueryable[对应的实现类型为EnumerableQuery]。
[6]Average:计算一个数值集合的平均值。
[7]Cast:将集合中的元素转化为指定的类型。
[8]Concat:连接两个集合。
[9]Contains:判断集合是否包含指定的元素。
[10]Count:计算集合中元素的数量。
[11]DefaultIfEmpty:获取集合,但如果集合是空的话返回包含一个默认元素的集合。
[12]Distinct:返回元素均为唯一的集合。
[13]ElementAt:获取指定索引[Index]处的元素。
[14]ElementAtOrDefault:获取指定索引[Index]处的元素,若元素为空则返回默认值。
[15]Except:获取排除指定元素后的集合。
[16]First:获取集合中的第一个元素。
[17]FirstOrDefault:获取集合中的第一个元素,若为空则返回默认值。
[18]GroupBy:使用指定的条件对集合进行分组,使用指定方式构建新元素并返回新的集合。
[19]GroupJoin:分组与关联两个存在“主外键”关系的集合。
[20]Intersect:对比指定集合获取交叉项,可指定交叉项的对比方法。
[21]Join:使用匹配的键值关联指定的集合。
[22]Last:获取集合中的最后一个元素
[23]LastOrDefault:获取集合中的最后一个元素,若为空则返回默认值。
[24]LongCount:以Int64来返回集合中元素的数量。
[25]Max:获取指定属性值为最大的元素。
[26]Min:获取指定属性值为最小的元素。
[27]OfType:使用指定的类型过滤集合中的元素。
[28]OrderBy:对集合进行升序排序,可以指定排序的属性。
[29]OrderByDescending:对集合进行降序排序,可以指定排序的属性。
[30]Prepend:在集合的头部添加元素。
[31]Reverse:翻转集合顺序。
[32]Select:将集合中的每个元素转为指定的新的格式。
[33]SelectMany:若集合中的元素存在子集合,则可通过该方法将这些属性“选择”出来并生成一个新的集合。
[34]SequenceEqual:判断是否与指定的集合相同。
[35]Single:获取集合中唯一一个元素,若集合元素为空或超过一个将抛出异常。
[36]SingleOrDefault:获取结合中唯一一个元素,若集合元素为空或超过一个则获取默认值。
[37]Skip:跳过指定数量的元素:并返回剩余元素的集合。
[38]SkipLast:从尾部开始跳过指定数量元素,并返回剩余元素集合。
[39]SkipWhile:跳过指定条件的元素,并返回剩余元素集合。
[40]Sum:计算集合中指定属性值得总和。
[41]Take:从头部开始获取指定个数的元素。
[42]TakeLast:从尾部开始获取指定个数的元素。
[43]TakeWhile:获取满足指定条件的元素的集合。
[44]ThenBy:以升序对集合进行二次排序。
[45]ThenByDescending:以降序对集合进行二次排序。
[46]Union:合并两个集合。
[47]Where:指定的条件过滤集合。
[48]Zip:使用指定的方式结合两个集合。

13.AsEnumerable(),AsQueryable()和ToList()
解析:
[1]AsQueryable将一个序列向下转换为一个IQueryable,它生成了一个本地查询的IQueryable包装。
[2]AsEnumerable将一个序列向上转换为一个IEnumerable,强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。
[3]调用ToList()会立刻查询并保存结果,而不会等到迭代时才查询,作用和lazyload是相反的。

14.IQueryable接口与IEnumberable接口区别
解析:IEnumerable<T>泛型类在调用自己的SKip和Take等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T>是将Skip、take这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。

15.联接操作符Join
解析:Join操作符类似于T-SQL中的inner join,它将两个数据源相联接,根据两个数据源中相等的值进行匹配。

16.联接操作符GroupJoin
解析:GroupJoin操作符常应用于返回“主键对象-外键对象集合”形式的查询,比如“产品类别-此类别下的所有产品”。

17.UNION和UNION ALL
解析:
[1]UNION:UNION操作符用于合并两个或多个SELECT语句的结果集。
[2]UNION ALL:默认地,UNION操作符选取不同的值。如果允许重复的值,请使用UNION ALL。

18.C# virtual修饰方法或属性
解析:在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。

19.LINQ中的join
解析:Join操作符类似于T-SQL中的inner join,它将两个数据源相联接,根据两个数据源中相等的值进行匹配。例如,可以将产品表与产品类别表相联接,得到产品名称和与其相对应的类别名称。查询语法如下所示:

var query =
	(from p in db.Products
     join c in db.Categories on p.CategoryID equals c.CategoryID
     where p.CategoryID == 1
     select new { p.ProductID, p.ProductName, c.CategoryID, c.CategoryName }).ToList();

方法语法如下所示:

var q =
    db.Products
    .Join
    (
        db.Categories,
        p => p.CategoryID,
        c => c.CategoryID,
        (p, c) => new { p.ProductID, p.ProductName, c.CategoryID, c.CategoryName }
    )
    .Where(p => p.CategoryID == 1)
    .ToList();

20.LINQ中的GroupJoin
解析:GroupJoin操作符常应用于返回“主键对象-外键对象集合”形式的查询,例如“产品类别-此类别下的所有产品”。查询语法如下所示:

var query =
    (from c in db.Categories
     join p in db.Products on c.CategoryID equals p.CategoryID into r
     select new
     {
        c.CategoryName,
        Products = r
     }).ToList();

方法语法如下所示:

var q =
		db.Categories
		.GroupJoin
		(
			db.Products,
			c => c.CategoryID,
			p => p.CategoryID,
			(c, p) => new
			{
				c.CategoryName,
				Products = p
			}
		)
		.ToList();

返回结果如下所示:

21.C#日志框架
解析:
[1]NLog
[2]Serillog

22.三层架构
解析:
[1]表现层[UI]
[2]业务逻辑层[Business Logic Layer,BLL]
[3]数据访问层[DAL]+实体类库[Model]

23.let子句
解析:引入用来临时保存查询表达式中的字表达式结果的范围变量。

24.into子句
解析:提供一个临时标识符。join子句、group子句或select子句可以通过该标识符引用查询操作中的中间结果。

25.C#协变和逆变
解析:
[1]协变:指能够使用与原始指定的派生类型相比,派生程度更大的类型。
[2]逆变:指能够使用派生程度更小的类型。
[3]协变->和谐的变->很自然的变化->string->object协变->狗是动物
[4]逆变->逆常的变->不正常的变化->object->string逆变->动物是狗
[5]out协变:一个泛型参数标记为out,代表它是用来输出的,作为结果返回
[6]in逆变:一个泛型参数标记为in,代表它是用来输入的,只能作为参数

本文地址:https://blog.csdn.net/shengshengwang/article/details/108988451

《C#学习日记4.doc》

下载本文的Word格式文档,以方便收藏与打印。