Работа с несколькими строками в таблице в качестве свойств - PullRequest
0 голосов
/ 29 сентября 2018

Я работаю с базами данных 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, поэтому не имеет большого значения, что изучать в первую очередь.

...