C#學習日記4

shengshengwang發表於2020-10-09

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,代表它是用來輸入的,只能作為引數