我是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