我有一个按时间顺序按升序时间戳排序的制表符分隔文件。每行有7列。每列是一个参数。Sqlite如何保留INSERT的顺序
我有一个sqlite数据库,我从选项卡文件中插入行作为批量INSERT命令中的参数。例如:
public void Create(IEnumerable<Game> items)
{
var sbFields = new StringBuilder();
sbFields.Append("ID,");
sbFields.Append("LEAGUE,");
sbFields.Append("VISITORTEAM,");
sbFields.Append("HOMETEAM,");
sbFields.Append("DATETIME,");
sbFields.Append("VISITORSCORE,");
sbFields.Append("HOMESCORE");
int numAppended = 7;
var sbParams = new StringBuilder();
for (int i = 1; i <= numAppended; i++)
{
sbParams.Append("@param");
sbParams.Append(i);
if (i < numAppended)
{
sbParams.Append(", ");
}
}
using (var command = new SQLiteCommand(Db))
{
command.CommandText = "INSERT OR IGNORE INTO GAMES (" + sbFields + ") VALUES(" + sbParams + ")";
command.CommandType = CommandType.Text;
using (var transaction = Db.BeginTransaction())
{
foreach (var game in items)
{
command.Parameters.Add(new SQLiteParameter("@param1", game.Id));
command.Parameters.Add(new SQLiteParameter("@param2", game.League));
command.Parameters.Add(new SQLiteParameter("@param3", game.VisitorTeam));
command.Parameters.Add(new SQLiteParameter("@param4", game.HomeTeam));
command.Parameters.Add(new SQLiteParameter("@param5", game.Date.Ticks));
command.Parameters.Add(new SQLiteParameter("@param6", game.VisitorScore));
command.Parameters.Add(new SQLiteParameter("@param7", game.HomeScore));
command.ExecuteNonQuery();
}
transaction.Commit();
}
}
}
我希望,当我检索,这将是在相同的顺序,我做的插入数据库的游戏列表(按时间顺序),而不是:其实它是在几乎是随机的顺序。因此,我必须在从数据库中读取游戏列表后对游戏列表进行排序。而且这个操作非常缓慢。我不想排序。我想按照与INSERT相同的顺序读取它。
这可能吗?注意:我做的不是想要添加一个新的参数(列)来表示顺序。这似乎是一个人为的解决方案,我乞求未来的问题。
这里是我从数据库中读取数据:
public IEnumerable<Game> Read()
{
List<Game> enumerable = new List<Game>();
using (var command = new SQLiteCommand(Db))
{
command.CommandText = "SELECT * FROM GAMES";
command.CommandType = CommandType.Text;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Game game = new Game();
game.Id = reader.GetInt32(0);
game.League = reader.GetString(1);
game.VisitorTeam = reader.GetString(2);
game.HomeTeam = reader.GetString(3);
game.Date = new DateTime(reader.GetInt64(4));
//game.Date = DateTime.FromFileTimeUtc(Convert.ToInt64(reader.GetInt64(4)));
game.VisitorScore = Convert.ToInt32(reader.GetInt32(5));
game.HomeScore = Convert.ToInt32(reader.GetInt32(6));
enumerable.Add(game);
}
}
}
return enumerable;
}
下面是表CREATE:
public void CreateTable()
{
string sql =
@"CREATE TABLE IF NOT EXISTS GAMES(
ID INTEGER PRIMARY KEY,
LEAGUE TEXT NOT NULL,
VISITORTEAM TEXT NOT NULL,
HOMETEAM TEXT NOT NULL,
DATETIME INTEGER NOT NULL,
VISITORSCORE INTEGER NOT NULL,
HOMESCORE INTEGER NOT NULL
)";
// if the database table already exists, this will throw an exception.
using (var command = new SQLiteCommand(sql, Db))
{
command.ExecuteNonQuery();
}
}
如何我目前的排序(太慢)
public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource, TKey>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
使用:
games = games.OrderByWithDirection(x => x.Date.Ticks, false).ToList();
SELECT * FROM GAMES ORDER BY ID –
该ID是一个散列并且不保证次序 – sapbucket
显示表定义。 –