您可以通过这种方式扩展部分类:
namespace SQLite
{
public partial class SQLiteConnection
{
public List<object[]> CustomQuery(string query, params object[] args)
{
var cmd = CreateCommand(query, args);
return cmd.ExecuteCustomQuery();
}
}
public partial class SQLiteCommand
{
public List<object[]> ExecuteCustomQuery()
{
if (SQLiteConnection.Trace)
{
Debug.WriteLine("Executing Query: " + this);
}
var stmt = Prepare();
try
{
var colLenght = SQLite3.ColumnCount(stmt);
var lstRes = new List<object[]>();
while (SQLite3.Step(stmt) == SQLite3.Result.Row)
{
var obj = new object[colLenght];
lstRes.Add(obj);
for (int i = 0; i < colLenght; i++)
{
var colType = SQLite3.ColumnType(stmt, i);
switch (colType)
{
case SQLite3.ColType.Blob:
obj[i] = SQLite3.ColumnBlob(stmt, i);
break;
case SQLite3.ColType.Float:
obj[i] = SQLite3.ColumnDouble(stmt, i);
break;
case SQLite3.ColType.Integer:
obj[i] = SQLite3.ColumnInt(stmt, i);
break;
case SQLite3.ColType.Null:
obj[i] = null;
break;
case SQLite3.ColType.Text:
obj[i] = SQLite3.ColumnString(stmt, i);
break;
}
}
}
return lstRes;
}
finally
{
SQLite3.Finalize(stmt);
}
}
}
}
在你有一个返回对象数组列表的方法之后,你可以通过这种方式调用:
var query = "select c.Id, c.Name, (select count(*) from Products where IdCategory = c.Id) from Categories c order by c.Name";
var lst = this.SqlConn.CustomQuery(query);
return (from s in lst
select new CategoryDescriptor {
Id = (int) s[0],
Name = (string) s[1],
ProductsCount = (int) s[2]
});