gpt4 book ai didi

c# - 从 sqlite 数据库性能初始化 c# 对象的最佳实践是什么

转载 作者:太空宇宙 更新时间:2023-11-03 12:12:16 29 4
gpt4 key购买 nike

考虑像这样的 sqlite 表:

+--------------+-----------+--------------+ -----------+
| Col1(string) | Col2(int) | Col3(double) | ... |
+--------------+-----------+--------------+------------+
| A_string | B_int | C_double | ... |
+--------------+-----------+--------------+------------+

... 表示更多列的 hunderts。目前,我们从 c# 中的表中获取数据是这样的:

using( SQLiteConnection con = new SQLiteConnection( databaseConnectionString ) )
{
con.Open(); //Open connection

using( SQLiteCommand cmd = new SQLiteCommand( "SELECT * FROM table", con ) )
{
var dataTable = new DataTable();
using( var sqlDataAdapter = new SQLiteDataAdapter( cmd ) )
{
sqlDataAdapter.Fill( dataTable );
if( dataTable.Rows.Count > 0 ) //ensure, there are some results
{
foreach( DataRow row in dataTable.Rows )
{
//Now initialize the c# objects
//But we do not wannt to hardcode every cast,
//cause the type information is already in the database
//therefore the function "getColumnValueAsRuntimeType()" is used to get the runntime type

string a = getColumnValueAsRuntimeType( "Col1", row );
int b = getColumnValueAsRuntimeType( "Col2", row );
double c = getColumnValueAsRuntimeType( "Col3", row );
...
}
}
}
}
}

private dynamic getColumnValueAsRuntimeType( string columnName, DataRow row )
{
int index = row.Table.Columns.IndexOf( columnName );
Type castTo = row.Table.Columns[ index ].DataType.UnderlyingSystemType;

if( typeof( Int64 ) == castTo )
{
return Convert.ChangeType( row[ columnName ], typeof( Int32 ) );
}

return Convert.ChangeType( row[ columnName ], castTo );
}

现在有一些性能问题是由于调用:

  int index = row.Table.Columns.IndexOf( columnName );
Type castTo = row.Table.Columns[ index ].DataType.UnderlyingSystemType;

在函数“getColumnValueAsRuntimeType()”处

所以我的主要问题是:

  1. 在 C# 中从 sqlite 数据库表中获取数据的最快/性能测试方法是什么?无需对源代码中的每个类型转换进行硬编码(我们不想在每次更改数据库类型时都重新编译源代码。数据库应该是主数据库)。为什么我还是要施法?我正在使用 c# 类访问数据库,数据应该已经输入。

我们在这里讨论的是一个包含 1000 列和数百万行的 sqlite 表。

最佳答案

我会使用类似 Dapper 的东西来处理映射。如果您创建一个对应于您的 SQL 语句返回的数据的类,那么 Dapper 将分析该类并为您为所有返回的行做一次列映射。

它看起来有点像这样:

public class DataClass
{
public string Astring { get; set; }

public int Bint { get; set; }

public double Cdouble { get; set; }
}

你的sql语句看起来像

var sql = "SELECT Col1 Astring, Col2 Bint, Col3 Cbouble FROM table";

通过在 SQL 中使用别名,您可以处理不同的命名约定。 Manually Map column names with class properties

然后你就可以了

using( SQLiteConnection con = new SQLiteConnection( databaseConnectionString ) )
{
con.Open();

var dataClassList = con.Query<DataClass>(sql);
}

Dapper 还可以处理嵌套对象: How do I map lists of nested objects with Dapper

关于c# - 从 sqlite 数据库性能初始化 c# 对象的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51536857/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com