Я работаю с базами данных sqlite, используя библиотеку System.Data.Sqlite.У меня есть таблица «метаданных», которая выглядит следующим образом:
Снимок экрана таблицы
Она не всегда содержит все эти строки и поля, и может такжебыть много дополнительных.Обычно я работаю с этими полями как со свойствами (которые я получаю, читая запросы и размышления), мой класс:
class MetadataTable
{
public string Version { get; set; }
public string Timestamp { get; set; }
public string Author { get; set; }
public string Location { get; set; }
public MetadataTable(string pathToDb)
{
using (SQLiteConnection connection = new SQLiteConnection($"Data Source={pathToDb};Version=3;"))
{
try
{
connection.Open();
}
catch (Exception)
{
throw new Exception("Unable to open database.");
}
using (SQLiteCommand command = new SQLiteCommand(connection))
{
command.CommandText = "SELECT key, value FROM metadata;";
using (SQLiteDataReader reader = command.ExecuteReader())
{
List<string> propertyNames = new List<string>();
List<string> propertyValues = new List<string>();
while (reader.Read())
{
propertyNames.Add(reader[0].ToString());
propertyValues.Add(reader[1].ToString());
}
for (int i = 0; i < propertyNames.Count; i++)
propertyNames[i] = propertyNames[i].ToLower().First().ToString().ToUpper()
+ propertyNames[i].Substring(1);
for (int i = 0; i < propertyValues.Count; i++)
typeof(MetadataTable).GetProperty(propertyNames[i])?.SetValue(this, propertyValues[i]);
}
}
}
}
}
И как он вызывается из Main ():
string pathToDb = "D:/Downloads/mytest.db";
MetadataTable metadataTable = new MetadataTable(pathToDb);
Console.WriteLine($"Version:{metadataTable.Version}, Author:{metadataTable.Author}, " +
$"Timestamp:{metadataTable.Timestamp}, Location:{metadataTable.Location ?? "Not specified"}");
НедавноЯ решил попробовать LINQ to SQL и написал простой класс для своей таблицы:
[Table(Name = "metadata")]
class Metadata
{
[Column(Name = "key")]
public string Key { get; set; }
[Column(Name = "value")]
public string Value { get; set; }
}
Вот как я читаю это в Main ():
using (SQLiteConnection connection = new SQLiteConnection($"Data Source={pathToDb};Version=3;"))
{
using (DataContext context = new DataContext(connection))
{
Table<Metadata> metadataFields = context.GetTable<Metadata>();
foreach (Metadata metadataField in metadataFields)
Console.WriteLine($"Key:{metadataField.Key}, Value:{metadataField.Value}");
}
}
Я нахожу это очень удобным,но есть ли такой же удобный способ работы со строками / полями в качестве свойств (как в коде MetadataTable выше) без использования отражения?
И кстати, является ли EntityFramework более подходящим (и более производительным?) для этой задачи?Раньше я не работал с LINQ to Entity или LINQ to SQL, поэтому не имеет большого значения, что изучать в первую очередь.