2016年9月8日 星期四

SQL SERVER 使用條件 IN 太慢時

如果要查詢某些資料在某資料表時,可以使用

語法一:當資料太大量時不要用,請使用語法三
Select * From TableA
Where TableA.Field_1 IN (Select Field_1 From TableB)

語法二:當資料太大量時不要用,請使用語法三
Select * From TableA
Inner Join TableB On TableA.Field_1 = TableB_Field1

語法三:
Select * From TableA as A
Where Exists (Select Field_1 From TableB Where A.Field_1 = Field1)


2016年9月2日 星期五

DataTable.Select 改成 LINQ 的方式,速度快上至少 10 倍

當DataTable的資料列太多時,使用 DataTable.Select() 來篩選資料的速度很慢,
此時可以改用 LINQ,速度上至少快上 10 倍之多

DataTable dt = GetDataTable(); ← 取得資料
// 假設 dt 的欄位 (ID<int>, FirstName<string>, LastName<string>)
// 使用 Select 方法時
DataRow[] = dt.Select("FirstName = 'xxx'");

// 使用 LINQ 方法時
var q = from p in dt.AsEnumerable()
            where p.Field<string>("FirstName").ToString() == "xxx"
            select p;

q 可能會找不到資料,
出現下列錯誤
System.InvalidOperationException: 來源未包含 DataRow。
   於 System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler)
   於 System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source)

所以如果要將 q 轉換為 DataTable,
需先判斷  q.Count() 是否為 0
if (q.Count() > 0)
  q.CopyToDataTable()