Я не уверен, что мне не хватает чего-то гротескно очевидного или чего-то еще, но я не могу понять, как эффективно получить доступ к таблицам в реляционной базе данных. Я использую PostgreSQL для сервера базы данных (и Npgsql для его доступа) и C# с Mono 2.0.
Скажем, у меня есть таблица, созданная следующими операторами CREATE TABLE и INSERT.
CREATE TABLE foo (
id UUID NOT NULL PRIMARY KEY,
bar VARCHAR(20) NOT NULL,
baz INT NOT NULL
)
INSERT INTO foo VALUES ('f42d3178-b900-11dd-ac23-001966607b2e', 'foo!', 1);
Насколько я понимаю, я должен (C#):
using(NpgsqlConnection dbc = new NpgsqlConnection(connectionString)) {
using(NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM foo LIMIT 1", dbc)) {
NpgsqlDataReader rdr = cmd.ExecuteReader();
if (!rdr.HasRows())
throw new Exception("No rows");
rdr.Read();
Guid id = rdr.GetGuid(0);
string bar = rdr.GetString(1);
int baz = rdr.GetString(2);
}
}
Но мне бы очень хотелось сделать что-то вроде следующего псевдокода:
using(NpgsqlConnection dbc = new NpgsqlConnection(connectionString)) {
using(NpgsqlCommand cmd = new NpgsqlCommand("SELECT * FROM foo LIMIT 1", dbc)) {
NpgsqlDataReader rdr = cmd.ExecuteReader();
if (!rdr.HasRows())
throw new Exception("No rows");
rdr.Read();
Guid id = (Guid)rdr["id"];
string bar = (string)rdr["bar"];
int baz = (int)rdr["baz"];
}
}
Мне не кажется (и, надеюсь, я просто где-то упускаю что-то очевидное), что требуется верхний метод доступа к базе данных, и это действительно обременительно, когда вы собираетесь работать с большим количеством отношений ... так что это есть способ сделать что-нибудь ближе к последнему псевдокоду?





Хех ... оказывается, мне нужно было просто пытался вместо того, чтобы спрашивать. Не могу найти никакой документации, подтверждающей, что это работает, но похоже, что это работает.
Если вы хотите, чтобы это было проще, используйте структуру ORM.
Если вам нужна максимальная производительность, это должно сработать. Просто помните, что кеширование всегда самое быстрое :)
Верхний пример также быстрее, потому что нет преобразования.
Оказывается, второй работает немного иначе, чем я думал. по крайней мере, для NpgsqlDataReader объекты уже типизированы и доступны, как если бы они были словарем. Итак, в приведенном выше примере rdr ["id"] уже является System.Guid. Я думаю, это очень круто, и это именно то, что доктор прописал. :)