我們目前正在使用LINQ來生成SQL查詢,其中有一些魔法用於處理特定於案例的查詢。字符串串聯優化
到目前爲止,它工作正常;非常快,幾乎沒有任何問題。在查詢數據庫中的大量數據時,我們最近遇到了效率問題。
我們構造查詢這樣:
var someIntList = new List<int> { 1,2,3,4,5 };
var query = dtx.Query.Containers.Where(c => c.ContainerID.IsIn(someIntList));
或
var someStringList = new List<int> {"a", "b", "c" };
query = dtx.Query.Containers.Where(c => c.BuildingName.IsIn(someStringList));
這將產生(和一幫其他的東西,這是不是與此一起):
SELECT * FROM Container WHERE ContainerID IN (1,2,3,4,5)
and
SELECT * FROM Container WHERE BuildingName IN ('a','b','c')
現在在這種特殊情況下,我們需要返回50,000行......這是通過5個獨立的查詢生成的,可以分解負載。 數據庫返回相當快(在幾秒鐘內),但生成查詢需要長時間。
這裏是被稱爲產生這種特定查詢的最後一個功能:
private static string GetSafeValueForItem(object item)
{
if (item == null)
return "NULL";
if (item is bool)
return ((bool)item ? "1" : "0");
if (item is string)
return string.Format("'{0}'", item.ToString().Replace("'", "''"));
if (item is IEnumerable)
return ListToDBList((IEnumerable)item);
if (item is DateTime)
return string.Format("'{0}'", ((DateTime)item).ToString("yyyy-MM-dd HH:mm:ss"));
return item.ToString();
}
private static string ListToDBList(IEnumerable list)
{
var str = list.Cast<object>().Aggregate("(", (current, item) => current + string.Format("{0},", GetSafeValueForItem(item)));
str = str.Trim(',');
str += ")";
return str;
}
是否有可以做,以加快在這種情況下,字符串連接任何明顯的改進?重構代碼並使用不同的實現(例如避免直接生成查詢並直接敲擊數據庫)並不是首選,但如果它提供了很大的性能提升,聽起來會很棒。
不知道爲什麼你're doing list.Cast