LinqToSql: Как вы читаете данные, когда вы еще не знаете таблицу БД? - PullRequest
1 голос
/ 25 июня 2019

Я уже работал с linq в прошлом и знаю, как получить доступ к базе данных с помощью SqlConnection и SqlCommand.Сегодня я хотел поработать с LinqToSql и посмотреть, смогу ли я облегчить чтение и запись в базу данных.Я сделал это Прохождение.

Вот код для класса клиента (я немного его изменил, но он все еще отлично работает):

[Table(Name = "Customers")]
class Customer
{
    [Column(IsPrimaryKey = true)]
    public string CustomerID { get; set; }
    [Column]
    public string City { get; set; }
}

И код от Main:

class Program
{
    static void Main(string[] args) 
    {
        DataContext db = new DataContext(@"Data Source=(local)\SQLEXPRESS;Initial Catalog=Northwind;User ID=sa;Password=xxx");
        Table<Customer> customers = db.GetTable<Customer>();

        IQueryable query = from cust in customers
                           //where cust.City == "London"
                           select cust;

        foreach (Customer customer in query)
            Console.WriteLine("ID:{0}; City={1}", customer.CustomerID, customer.City);
        Console.ReadKey();
    }
}

Это сработало, и я счастлив, потому что это делает доступ к базе данных намного проще для меня.Но есть еще пара вещей, которые меня беспокоят:

  1. Кажется, что для каждого столбца, который я хочу включить, мне нужно создать новое свойство в классе Customer и добавить[Столбец] над ним.
  2. Мне нужно создать новый класс для каждой таблицы, из которой я хочу читать (например, «Клиенты», «Заказы и поставщики» в БД «Борей»).

Прежде всего, это, кажется, довольно много ненужной и повторяющейся работы.Я что-то здесь не так делаю?

Также я хочу, чтобы пользователь вводил имя базы данных и таблицу.Это означает, что я еще не знаю, какую базу данных он выберет, и еще не знаю структуру таблицы.Я пока не могу создать класс, который должен представлять таблицу.

Это означает, что мне нужно:

  1. Создать тип / класс / объект динамически.Я не могу использовать Table<Customer> customers = db.GetTable<Customer>(), потому что я еще не знаю тип.Типом будет динамически создаваемый класс.
  2. Отметьте тип / класс / объект как таблицу с помощью [Table(Name="xxx")].
  3. Считайте столбцы из SqlTable и создайте для каждого столбца свойство ипометьте его [Столбец].
  4. После того, как я закончу с этим, я могу получить таблицу с Table<T> table = db.GetTable<T>(), выполнить запрос и отобразить datarows.

Мой второй (и более важный) вопрос: как я могу это сделать?У кого-нибудь есть примеры кода или ссылки для обмена?Или этот подход неправильный?

1 Ответ

0 голосов
/ 25 июня 2019

Вы можете сохранить результат в динамическом объекте так же, как это.

dynamic table = db.GetTable<T>()

и используйте отражение, чтобы получить тип объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...