我们目前正在使用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