顯示具有 資料庫 標籤的文章。 顯示所有文章
顯示具有 資料庫 標籤的文章。 顯示所有文章

2011年11月17日 星期四

LINQ動態查詢 使用(PredicateBuilder)

官網抵佳:PredicateBuilder
需使用套件: LINQKit
套件及範例下載位址:在LINQKit頁面的最下方

官網範例如下
IQueryable<SearchProducts>(params string[] keywords)
{
 var predicate = PredicateBuilder.False();
 foreach (string keyword in keywords)
 {
  string temp = keyword; // 很重要!! 一定要加
  predicate = predicate.Or (p => p.Description.Contains (temp));
 }
 return dataContext.Products.Where (predicate);
}

--------------------------------
下面是運作說明

步驟1:建立PredicateBuilder物件(我們需要使用此物建來作查詢條件的串接)
var predicate = PredicateBuilder.False();
步驟2:迴圈加入查詢條件
foreach(string keyword in keywords)
{
  string temp = keyword; // 避免參考到相同變數位址,所以需加上此行
  predicate = predicate.Or (p =< p.Description.Contains (temp));
}
步驟3:執行查詢
dataContext.Products.Where (predicate);
or 使用 dataContext.Products.Where(predicate.Compile());

-----------------完成!!------------------

接下來是運作原理的說明

當只執行
var predicate = PredicateBuilder.False();
dataContext.Products.Where (predicate.Compile());
這段描述看起來會像是 dataContext.Products.Where (src => false);

若是執行
var predicate = PredicateBuilder.False();
predicate = predicate.Or (src => src.keyword == "123");
dataContext.Products.Where (predicate.Compile());
這段描述看起來會像是 dataContext.Products.Where (src => false || src.keyword == "123");

若是執行
var predicate = PredicateBuilder.False();
predicate = predicate.Or (src => src.keyword == "123");
predicate = predicate.And(src => src.id == 5);
dataContext.Products.Where (predicate.Compile());
這段描述看起來會像是 dataContext.Products.Where (src => false || src.keyword == "123" && src.id == 5);

由此可知條件是串接起來的
因此預設選擇PredicateBuilder.False或PredicateBuilder.True就很重要了

舉個例子,如果希望找出keyword1或keyword2,兩個關鍵字只要一個成立即可的結果

範例會像這樣
var predicate = PredicateBuilder.False();
predicate = predicate.Or (src => src.keyword == "123");
predicate = predicate.Or (src => src.keyword == "456");
dataContext.Products.Where (predicate.Compile());
這段描述看起來會像是 dataContext.Products.Where (src => false || src.keyword == "123" ||src.keyword == "456"); //這是正確的結果
若預設選擇PredicateBuilder.True();
這段描述看起來會像是dataContext.Products.Where (src => true || src.keyword == "123" ||src.keyword == "456");
這樣一來查詢的結果永遠會是true,而導致錯誤了

在一個例子,如果希望找出keyword1且keyword2,兩個關鍵字都要成立的結果
範例應該像這樣
var predicate = PredicateBuilder.True();
predicate = predicate.And (src => src.keyword == "123");
predicate = predicate.And (src => src.keyword == "456");
dataContext.Products.Where (predicate.Compile());
這段描述看起來會像是 dataContext.Products.Where (src => true && src.keyword == "123" && src.keyword == "456"); //這是正確的結果
若預設選擇PredicateBuilder.False();
這段描述看起來會像是 dataContext.Products.Where (src => false && src.keyword == "123" && src.keyword == "456");
這樣一來查詢的結果就永遠會是false,而導致錯誤了







2009年1月16日 星期五

各種Integer所佔的記憶體大小

TinyInt ---- 1Byte
SmallInt -- 2Bytes
Int ---------- 4Bytes
BigInt ----- 8Bytes

2009年1月14日 星期三

搜尋時間區間內的所有區間


假設我們要搜尋Start與End時間點內所有的區間(3,4,5,6)
用法如下:
string expression = string.Format("(Start_DateTime<='{0}' AND End_DateTime>='{0}') OR (Start_DateTime<='{1}' AND End_DateTime>='{1}') OR (Start_DateTime>='{0}' AND End_DateTime<='{1}') OR (Start_DateTime<='{0}' AND End_DateTime>='{1}')", startTime, endTime);
DataRow[ ] rows = table.Select(expression);

//此時找到的會是 3,4,5,6 這四個區間

2008年11月21日 星期五

搜尋並轉換欄位值

假設有某個欄位,名稱為"MediaType"。是Integer型態,存放的資料範圍是1-4,對應如下:
1:文字
2:圖片
3:影片
4:PowerPoint

若要SELECT出MediaType欄位則,一般的SQL語法如下:
"SELECT MediaType FROM TempTable"



若要將裡面的值轉換成其他文字,則轉換的SQL語法如下:
"SELECT CASE MediaType When '1' Then '文字' "When '2' Then '圖片' When '3' Then '影片' When '4' Then 'PowerPoint' End AS MediaType FROM TempTable"

新增額外的判斷欄位至資料表

public class ConditionColumn
{
 private DataTable table = new DataTable();
 public void Main()
 {
  table.Columns.Add(new DataColumn("MediaType"));
  DataRow dr1 = table.NewRow();
  DataRow dr2 = table.NewRow();
  DataRow dr3 = table.NewRow();
  DataRow dr4 = table.NewRow();
  dr1["MediaType"] = 1;
  dr2["MediaType"] = 2;
  dr3["MediaType"] = 2;
  dr4["MediaType"] = 4;
  table.Rows.Add(dr1);
  table.Rows.Add(dr2);
  table.Rows.Add(dr3);
  table.Rows.Add(dr4);
 }

 public void AddColumn()
 {
  table.Columns.Add("Comment", System.Type.GetType("System.String"), "IIF(MediaType=1,'文字',IIF(MediaType=2,'圖片','未知'))");
 }
}

呼叫 AddColumn 前的資料表

呼叫 AddColumn 後的資料表

2008年7月15日 星期二

DataTable 合併

若要將兩個Schema相同的DataTable合併
可以使用DataTable.Merge() 方法

假設有兩DataTable 分別為 Table1 及 Table2
若要將 Table2 合併到 Table1, 使用方式如下:
Table1.Merge(Table2);

若要將 Table2 合併到 Table1, 但重複的資料列只保留一筆
則必須多設定Table1的PrimaryKey(主鍵)屬性, 使用方式如下
Table1.PrimaryKey = new DataColumn[ ] { Table1.Columns[ "primaryKeyColName" ] };
Table1.Merge(Table2);