LinqToSql:当您还不知道数据库表时,如何读取数据?

时间:2019-06-25 12:22:42

标签: c# linq linq-to-sql

我过去一直在使用linq,我知道如何使用SqlConnection和SqlCommand访问数据库。今天,我想与 LinqToSql 一起使用,看看是否以及如何使从数据库的读取和写入变得更加容易。我做了this演练。

这是客户类的代码(我做了一些修改,但仍然可以正常使用):

[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类中创建一个新属性,并在其上方添加一个[Column]。
  2. 我需要为要读取的每个表(例如Northwind数据库中的Customer,Orders和Suppliers)创建一个新的Class

首先,这似乎是很多不必要的重复性工作。我在这里做错什么了吗?

我还希望用户输入数据库和表的名称。这意味着我还不知道他将选择哪个数据库,我也不知道表的结构。我还不能创建应该代表表格的类。

这意味着我将需要:

  1. 动态创建类型/类/对象。我无法使用Table<Customer> customers = db.GetTable<Customer>(),因为我还不知道类型。类型将是动态创建的类。
  2. 使用[Table(Name="xxx")]将类型/类/对象标记为表。
  3. 从SqlTable中读取列,并为每个列创建一个属性,并用[Column]对其进行标记。
  4. 完成此操作后,我可以使用Table<T> table = db.GetTable<T>()获取表,执行查询并显示数据行。

我的第二个(也是更重要的问题)是:我该怎么做?有没有人可以分享代码示例或链接?还是这种方法错误?

1 个答案:

答案 0 :(得分:0)

您可以像这样将结果存储在动态对象中。

dynamic table = db.GetTable<T>()

并使用反射来获取对象的类型。