是否可以从Sqlite查询返回动态对象或数据集?

我在我的Xamarin.Forms应用程序中使用Sqlite.Net 。 到目前为止,如果我的对象是这样的类,那么返回对象列表非常棒:

 SqliteDatabase.Connection.Query("Select * from Customers"); 

我现在想从查询中动态返回DataSet的等价物

 SqliteDatabase.Connection.Query("Select * from Customers inner join Calls on Customers.Id=Calls.CustomerId") 

现在从第二个查询我想返回一个DataSet而不是一个对象列表。 我知道我可以创建一个新的对象,它组合了CustomersCalls的列,但我不想每次想要查询数据库时都要创建对象。

是否可以动态返回DatasetObject

SQLite.NET PCL是围绕sqlite的.NET包装器。

因此,您可以通过在LINQ或Lambda中使用连接而不是在Query中查询类似于EF的查询。 包装器将为您处理转换为sqlite查询。

然后,您可以返回已连接类型或动态类型的新数据类型。

注意 :在sqlite中不直接支持连接( 更多信息 ), 这里提到了解决方法。

示例代码:

 var conn = new SQLiteConnection(sqlitePlatform, "foofoo"); var query = from customer in conn.Table().ToList() join call in conn.Table().ToList() on customer.ID equals call.CustomerId select new { Customer = customer , Calls = call }; 

Lambda版本:

 conn.Table().ToList().Join (conn.Table().ToList(), customer => customer.Id, call => call.CustomerId, (customer, call) => new { Customer = customer, Calls = call }); 

最后,我实际上设法提出了一个方法,它将运行任何查询并将行作为列表中的项返回,并将列作为数组中的对象返回:

  public List RunSql(string sqlString, bool includeColumnNamesAsFirstRow) { var lstRes = new List(); SQLitePCL.sqlite3_stmt stQuery = null; try { stQuery = SQLite3.Prepare2(fieldStrikeDatabase.Connection.Handle, sqlString); var colLenght = SQLite3.ColumnCount(stQuery); if (includeColumnNamesAsFirstRow) { var obj = new object[colLenght]; lstRes.Add(obj); for (int i = 0; i < colLenght; i++) { obj[i] = SQLite3.ColumnName(stQuery, i); } } while (SQLite3.Step(stQuery) == SQLite3.Result.Row) { var obj = new object[colLenght]; lstRes.Add(obj); for (int i = 0; i < colLenght; i++) { var colType = SQLite3.ColumnType(stQuery, i); switch (colType) { case SQLite3.ColType.Blob: obj[i] = SQLite3.ColumnBlob(stQuery, i); break; case SQLite3.ColType.Float: obj[i] = SQLite3.ColumnDouble(stQuery, i); break; case SQLite3.ColType.Integer: obj[i] = SQLite3.ColumnInt(stQuery, i); break; case SQLite3.ColType.Null: obj[i] = null; break; case SQLite3.ColType.Text: obj[i] = SQLite3.ColumnString(stQuery, i); break; } } } return lstRes; } catch (Exception) { return null; } finally { if (stQuery != null) { SQLite3.Finalize(stQuery); } } } 

非常感谢user1! 工作完美。 这里只是一个如何使用ur方法的例子:

 var objects = mySQLiteConnection.RunSql("SELECT * FROM Persons", true); // ColumnNames List ColumnNames = new List(); for (int column = 0; column < objects[0].Length; column++) { if (objects[0][column] != null) spaltennamen.Add((string)objects[0][column]); } // RowValues for (int row = 1; row < objects.Count; row++) { for (int column = 0; column < objects[row].Length; column++) { if (objects[row][column] != null) System.Diagnostics.Debug.WriteLine(spaltennamen[column] + " : " + objects[row][column]); } } 

听起来你想要做的就是重新创建ADO.NET。 当你说“DataSet”时,我猜你在谈论ADO.NET。 这可能意味着您不希望使用SQLite.Net库中内置的ORMfunction。

我创建了这个版本的库,允许您从SQLite数据库中进行平面表读取。 这意味着您可以根据需要将数据读入ADO.NET数据集。

https://github.com/MelbourneDeveloper/SQLite.Net.Standard