【问题标题】:LINQ and result set mapping in class类中的 LINQ 和结果集映射
【发布时间】:2011-04-29 10:47:11
【问题描述】:

这里是代码

        var customers = db.ExecuteQuery<Customer>(@"SELECT CustomerID, CompanyName, ContactName, ContactTitle, 
   Address, City, Region, PostalCode, Country, Phone, Fax
   FROM   dbo.Customers
   WHERE  City = {0}", "London");

foreach (Customer c in customers)
   Console.WriteLine(c.ContactName);

代码执行 sql 并重新调整客户记录。我的问题是如何将结果自动存储在客户类中......我不明白。如果你看到这行代码 db.ExecuteQuery&lt;Customer&gt; 从这里我们可以了解到客户结果将被返回,客户数据将存储在客户类中。如何自动存储数据并分配给客户类中的正确属性,因为客户类CustomerID 属性名称可能是 CustID....那么会发生什么。

db.ExecuteQuery&lt;Customer&gt; 这行让我很困惑,我只是不明白将使用返回的客户数据创建一个新的客户实例......所以请详细讨论。

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    ExecuteQuery 只是运行任意 SQL(在应用 string.Format-esque 参数化之后),然后将 IDataReader 结果具体化为对象序列。

    请注意,mapped 类型和 db-columns/type-members 之间的映射由数据上下文很好地定义(通常通过成员上的属性,但并非总是如此),但 IIRC ExecuteQuery 不 应用这些映射(我很高兴在这里得到更正)。您可以通过db.Mapping.GetMetaType(typeof(Customer)) 进行检查。

    这里的基本原理与你执行时没有什么不同

    var cust = db.Customers.ToList();
    

    除了db.Customers 版本可以应用更多的映射等。

    物化本身(即创建对象和设置成员)是反射和元编程的一个例子;大多数 ORM 和微 ORM 在那里的工作方式几乎相同:检查类型(上面的Customer)并检查阅读器中的字段 - 然后即时构建一些代码(通常是缓存的),这些代码将创建新的对象并设置成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-13
      • 2011-01-26
      • 2011-05-03
      • 2021-12-17
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多