В настоящее время мы используем 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')
Теперь в этой конкретной ситуации нам нужно вернуть 50 000 строк, которые генерируются через 5 отдельных запросов, разделяя нагрузку. DB возвращается довольно быстро (в течение нескольких секунд), однако генерация запроса занимает long времени.
Вот самое последняя функция, которая вызывается для создания этого конкретного запроса:
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;
}
Существуют ли какие-либо очевидные улучшения, которые могут быть сделаны, чтобы ускорить конкатенации в этом случае? Рефакторинг кода и использование другой реализации (например, избежание создания запроса и попадания непосредственно в базу данных) не является предпочтительным, но если бы он предложил большой прирост производительности, было бы здорово услышать.
Не знаю, почему ты 'do list.Cast