現在、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)
を
および
SELECT * FROM Container WHERE BuildingName IN ('a','b','c')
この特定の状況では、負荷を分割する5つの別個のクエリによって生成される50,000行を返す必要があります。 DBはかなり速く(数秒以内に)返されますが、クエリの生成にはの時間がかかります()。ここで
は、この特定のクエリを生成するために呼び出される非常に最後の関数です:
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;
}
は、この場合には、文字列の連結をスピードアップさせることができる任意の明白な改善点はありますか?コードをリファクタリングし、別の実装(クエリの生成やデータベースへの直接的なアクセスを避けるなど)を使用することは好ましくありませんが、パフォーマンスが大幅に向上した場合はそれを聞くのが良いでしょう。
とにかく普通のIEnumerableがオブジェクトであるときにリスト012を作成しています。