我是SQL的新手,并且在理解Where Where语句效率如此低下时遇到了一些麻烦。Linq比SQL更快的地方Where Where
数据库的一点背景。这是一个用于存储图标的SQL Compact Edition数据库。一个项目可以有多个图标,每个图标可以有多个路径,每个路径由几何,颜色和不透明度组成。大约有2000个图标,这导致大约12000个路径。
我试图创建一个查询仅返回属于特定项目
SELECT Icons.Id, Icons.Name... etc FROM Icons
INNER JOIN Projects ON Icons.FK_ProjectId = Projects.Id
INNER JOIN IconDetails ON Icons.Id = IconDetails.FK_IconId
INNER JOIN Paths ON IconDetails.FK_PathId = Paths.Id
INNER JOIN Colours ON IconDetails.FK_ColourId = Colours.Id
WHERE (Icons.FK_ProjectId = 5)
这需要〜2.8秒就可以完成的图标。但是,如果我删除底部的Where
声明,它只需要约0.3秒。然后我可以使用C#Linq来选择它们属于我想要的项目的所有图标。
var iconTable = GetIconDataFromDatabase().Where(e => e.Project == projectName);
private List<IconData> GetIconDataFromDatabase()
{
var getAllIconsCommand = new SqlCeCommand(// SQL Above);
return ReturnIconData(LOCAL_CONNECTION_STRING, getAllIconsCommand);
}
private List<IconData> ReturnIconData(string connectionString, SqlCeCommand command)
{
var IconDataToReturn = new List<IconData>();
using (var connection = new SqlCeConnection(connectionString))
{
command.Connection = connection;
using (command)
{
try
{
connection.Open();
using (SqlCeDataReader dataReader = command.ExecuteReader())
{
while (dataReader.Read())
{
IconDataToReturn.Add(new IconData
{
Id = int.Parse(dataReader["Id"].ToString().Trim()),
Project = dataReader["ProjectName"].ToString().Trim(),
Name = dataReader["Name"].ToString().Trim(),
Geometry = Geometry.Parse(dataReader["Geometry"].ToString().Trim()),
Colour = dataReader["Colour"].ToString().Trim(),
Opacity = double.Parse(dataReader["Opacity"].ToString().Trim()),
IsPathCompact = bool.Parse(dataReader["Compact"].ToString().Trim()),
ZOrder = int.Parse(dataReader["ZOrder"].ToString().Trim())
});
}
}
}
}
return IconDataToReturn;
}
我不明白如何能够更快地返回每一个图标,然后自己过滤掉结果。
你显示的是sql,但你正在谈论LINQ。你能展示真正的C#代码吗? sql查询是什么实际执行或者你认为它是什么? –
您在所显示的代码中完全没有使用'iconTable',但是您使用的是未声明的'dataReader' ...这很难遵循您正在做的事情。 –
您是否清除下一次执行的sql缓存? – mybirthname