發表文章

目前顯示的是有「CSharp」標籤的文章

C# MongoDb基本操作

圖片
前言    公司的資料庫,部份資料表過大,造成查詢效能低落。目前考慮要將較大的資料表及較不重要的Log檔,搬到MongoDB上,來解決效能瓶頸。 安裝 Mongodb Windows 4.4.1 MongoDB Database Tools 資料庫管理工具,用來執行備份、還原。 下載後,將相關exe放到安裝目錄內。 Nuget C# MongoDB Driver  : Install-Package mongocsharpdriver -Version 2.11.4 C# 新增、讀取、更新、刪除 (CRUD) 操作 安裝套件 Install-Package mongocsharpdriver -Version 2.11.4 初始化        private static void Init()         {             string connectionString = "mongodb://localhost"; // MongoDB 連線字串             _mongoClient = new MongoClient(connectionString);// 產生 MongoClient  物件             _mongoDatabase = _mongoClient.GetDatabase("Demo");// 取得  MongoDatabase 物件             _mongoCollectionProduct ...

[Expression Tree] LINQ動態欄位查詢-動態代理類別

圖片
  在前一篇文章" LINQ動態欄位查詢 "介紹到使用Expression來作欄位的動態查詢,但此方法有一缺點是因EntityFramework在查詢時,不能回傳與來源型別一樣的結果,所以使用上會變成查ProductEntity但回傳另一型別ProductInfo。若只是基本的單資料表查詢,那倒還好,但在實務上通常會Join到其他資料表後,再回傳一個多個資料表欄位的類別,如下程式查詢 ProductEntity 及 CategoryEntity ,回傳 ProductInfo 。 此時若要再透過前文的 動態查詢欄位方法 ,則必須建立另一個類別才能達到,例 ProductXXXInfo.........,雖然只要新增一個類別再繼承ProductInfo即可以,但之後隨著系統發展越來越大的話,這種為了動態查詢建立的代理類別會越來越多..........。心想手動建立代理類別的方式可以是動態的嗎....?   印象中EntityFramework預設就有使用代理類別來作LazyLoading機制,心想可以參考相關的作法來實作代理類別,在Google搜尋一下後,找到一篇使用ILGenerator來達到此功能。    什麼是ILGenerator? 根據MSDN的介紹,可以透過它在執行時期產生 Microsoft Intermediate Language (MSIL) 指令,建立動態組件、方法和建構函式...等等 ( 詳原文 )。

[Expression Tree] MSDN學習系列 3-使用運算式樹狀結構建置動態查詢

   本系列的最後一篇文章,此篇要講的是如何使用運算式樹狀架構來 建立動態 (Dynamic) 的 LINQ 查詢 ,並在執行時期產生對應的查詢方法。在開始先來講為何需要動態查詢? 假設我們有一個GridView呈現產品清單,但要提供使用者直接在每個欄位的標題點選作排序、飾選的功能。若要依使用者點選的欄位來查詢的話,程式需依欄位名稱來各別寫Where或Orderby,如下程式 private void TraditionQuery() { string sortColumn = "ProductName"; string filterColumn = "CategoryName"; string filterValue = "HTC"; IQueryable<ProductModel> data = ProductModel.GetDatas(); switch (sortColumn) { case "CategoryName": data = data.OrderBy(m => m.CategoryName); break; case "ProductName": data = data.OrderBy(m => m.ProductName); break; } switch (filterColumn) { case "CategoryName": data = data.Where(m => m.CategoryName == filterValue); break; case "ProductName": data = data.Where(m => m.ProductName == filterValue); break; } } 目前只針對...

[Expression Tree] MSDN學習系列 2-修改運算式樹狀架構

圖片
     繼上篇 運算式樹狀架構 ,此篇要講的是如何修改運算式樹狀架構,預設的情形下,運算式樹狀架構是不可直接修改的.....嗯~~~有看沒有懂…對吧..XD,下列程式碼,就是一個完整的樹狀結構,但你不可以直接去異動他任一節點,例如:將大於換小於、and換成or Expression<Func<string, bool>> expr = name => name.Length > 10 && name.StartsWith("G");

[Expression Tree] MSDN學習系列 1-運算式樹狀架構

圖片
    最近參考一些較知名的Library,例:Automapper、DynamicQuery..等等,都有用到大量的Expression來作動態查詢,由於Expression認識的不夠深,以致在擷取某些程式碼來修改時都覺得很吃力......=.=。而這兩天剛好看到msdn有提供一系列的文章,想說將它整個練習一遍,並將所理解的記錄下來 ps:其實是轉化自己較容易懂的語言XD。 什麼是Expression Tree? 就是將程式碼當作樹狀結構的資料,並可以動態修改Runtime的程式碼、動態查詢及取得程式碼中的相關資訊。

Const 變數與Static readonly的不同

假日在家看書 (Java 語言 ) ,在使用 static   final 變數時,可以使用針對該變數使用 Switch{} 陳述式,但使用 C# 的 staitc readonly 時卻無法使用,錯誤訊息為 [ 必須為 常數值 const ] 。   為此我看了 msdn 作一下小研究, const 與 static readonly   都是 唯讀 變數,系統啟動時就存在,其生命週期等同 Application 變數。         常數 const 在宣告時就必須 初始它的值且是固定不可變的 ,而 static readonly 則是宣告時不強制初始值,但既然已經宣告作 readonly 之後當然也不能再給值,所以一般若宣告 static readonly 時一定會給初始值,不過 其初始值是可變的 。   程式碼比較如下 : const int delayMonth=1; //正確   const int delayMonth=DateTime.Now.Month; //錯誤 因為DateTime.Now.是可變的 例如 : 本月是 7 下一個月是 8 ,常數必須是一個 明確的固定值 而不是隨著外在因素變動。   static   readonly int delayMonth= DateTime.Now. Month ;// 正確   初始值是可變的   由上述的兩個特性作比較的話 switch 的陳述式比須針對 不可變動值才能作 case 的動作 ,所以 static readonly 並不適用,只能使用 const 變數 。   參考 ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_csref/html/79eb447c-117b-4418-933f-97c50aa472db.htm