当前位置:Gxlcms > 数据库问题 > 《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句

《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句

时间:2021-07-01 10:21:17 帮助过:6人阅读

3-2使用原生SQL语句查询

问题

  你想在实体框架中使用原生的SQL语句,来更新底层数据存储。

解决方案

  假设你有一张如图3-2所示的Payment数据库表,使用实体框架设计器工具创建了一个如图3-2所示的模型。

技术分享

图3-2 Payment表,包含一个供应商的付款信息

技术分享

图3-3 包含一个Payment实体的模型

 

   为了在底层的Payment表中执行一句和多句SQL语句,可以使用在DbContext类中的属性Database中的ExecuteSQlCommand()方法。 虽然我们能在模型中查询Payment实体,ExecuteSqlCommand方法能让我们直接查询底层的数据库,放弃实体框架的某些特性,比如变化跟踪。我们需要一个简单的模型对象,它包含一个用于执行SQL命令的上下文对象。

  下面代码清单3-4执行一句或多句SQL语句

代码清单3-4 执行查询语句

  1. <span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 删除之前的测试数据</span>
  2. <span style="color: #008080;"> 2</span> <span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> context = <span style="color: #0000ff;">new</span><span style="color: #000000;"> EFRecipesEntities())
  3. </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> {
  4. </span><span style="color: #008080;"> 4</span> context.Database.ExecuteSqlCommand(<span style="color: #800000;">"</span><span style="color: #800000;">delete from chapter3.payment</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> }
  6. </span><span style="color: #008080;"> 6</span> <span style="color: #008000;">//</span><span style="color: #008000;">插入两行数据</span>
  7. <span style="color: #008080;"> 7</span> <span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> context = <span style="color: #0000ff;">new</span><span style="color: #000000;"> EFRecipesEntities())
  8. </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> {
  9. </span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">var</span> sql = <span style="color: #800000;">@"</span><span style="color: #800000;">insert into Chapter3.Payment(Amount, Vendor)
  10. </span><span style="color: #008080;">10</span> <span style="color: #800000;"> values (@Amount, @Vendor)</span><span style="color: #800000;">"</span><span style="color: #000000;">; //这里可以使用@p0这样的参数占位符,ado.net为自动为我们创建参数对象
  11. </span><span style="color: #008080;">11</span> <span style="color: #0000ff;">var</span> parameters = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DbParameter[]
  12. </span><span style="color: #008080;">12</span> <span style="color: #000000;"> {
  13. </span><span style="color: #008080;">13</span> <span style="color: #0000ff;">new</span> SqlParameter {ParameterName = <span style="color: #800000;">"</span><span style="color: #800000;">Amount</span><span style="color: #800000;">"</span>, Value = <span style="color: #800080;">99.97M</span><span style="color: #000000;">},
  14. </span><span style="color: #008080;">14</span> <span style="color: #0000ff;">new</span> SqlParameter {ParameterName = <span style="color: #800000;">"</span><span style="color: #800000;">Vendor</span><span style="color: #800000;">"</span>, Value = <span style="color: #800000;">"</span><span style="color: #800000;">Ace Plumbing</span><span style="color: #800000;">"</span><span style="color: #000000;">}
  15. </span><span style="color: #008080;">15</span> <span style="color: #000000;"> };
  16. </span><span style="color: #008080;">16</span>
  17. <span style="color: #008080;">17</span> <span style="color: #0000ff;">var</span> rowCount =<span style="color: #000000;"> context.Database.ExecuteSqlCommand(sql, parameters);
  18. </span><span style="color: #008080;">18</span>
  19. <span style="color: #008080;">19</span> parameters = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DbParameter[]
  20. </span><span style="color: #008080;">20</span> <span style="color: #000000;"> {
  21. </span><span style="color: #008080;">21</span> <span style="color: #0000ff;">new</span> SqlParameter {ParameterName = <span style="color: #800000;">"</span><span style="color: #800000;">Amount</span><span style="color: #800000;">"</span>, Value = <span style="color: #800080;">43.83M</span><span style="color: #000000;">},
  22. </span><span style="color: #008080;">22</span> <span style="color: #0000ff;">new</span><span style="color: #000000;"> SqlParameter
  23. </span><span style="color: #008080;">23</span> <span style="color: #000000;"> {
  24. </span><span style="color: #008080;">24</span> ParameterName = <span style="color: #800000;">"</span><span style="color: #800000;">Vendor</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  25. </span><span style="color: #008080;">25</span> Value = <span style="color: #800000;">"</span><span style="color: #800000;">Joe‘s Trash Service</span><span style="color: #800000;">"</span>
  26. <span style="color: #008080;">26</span> <span style="color: #000000;"> }
  27. </span><span style="color: #008080;">27</span> <span style="color: #000000;"> };
  28. </span><span style="color: #008080;">28</span>
  29. <span style="color: #008080;">29</span> rowCount +=<span style="color: #000000;"> context.Database.ExecuteSqlCommand(sql, parameters);
  30. </span><span style="color: #008080;">30</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">{0} rows inserted</span><span style="color: #800000;">"</span><span style="color: #000000;">, rowCount.ToString());
  31. </span><span style="color: #008080;">31</span> <span style="color: #000000;"> }
  32. </span><span style="color: #008080;">32</span>
  33. <span style="color: #008080;">33</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 获取并显示数据</span>
  34. <span style="color: #008080;">34</span> <span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> context = <span style="color: #0000ff;">new</span><span style="color: #000000;"> EFRecipesEntities())
  35. </span><span style="color: #008080;">35</span> <span style="color: #000000;"> {
  36. </span><span style="color: #008080;">36</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">Payments</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  37. </span><span style="color: #008080;">37</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">========</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  38. </span><span style="color: #008080;">38</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> payment <span style="color: #0000ff;">in</span><span style="color: #000000;"> context.Payments)
  39. </span><span style="color: #008080;">39</span> <span style="color: #000000;"> {
  40. </span><span style="color: #008080;">40</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">Paid {0} to {1}</span><span style="color: #800000;">"</span><span style="color: #000000;">, payment.Amount.ToString(),
  41. </span><span style="color: #008080;">41</span> <span style="color: #000000;"> payment.Vendor);
  42. </span><span style="color: #008080;">42</span> <span style="color: #000000;"> }
  43. </span><span style="color: #008080;">43</span> <span style="color: #000000;"> }
  44. </span><span style="color: #008080;">44</span>
  45. <span style="color: #008080;">45</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">\nPress <enter> to continue...</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  46. </span><span style="color: #008080;">46</span> Console.ReadLine();

代码清单3-4的输出如下:

  1. <span style="color: #008080;">1</span> <span style="color: #800080;">2</span><span style="color: #000000;"> rows inserted
  2. </span><span style="color: #008080;">2</span> <span style="color: #000000;">Payments
  3. </span><span style="color: #008080;">3</span> ========
  4. <span style="color: #008080;">4</span> Paid $<span style="color: #800080;">99.97</span><span style="color: #000000;"> to Ace Plumbing
  5. </span><span style="color: #008080;">5</span> Paid $<span style="color: #800080;">43.83</span> to Joe<span style="color: #800000;">‘</span><span style="color: #800000;">s Trash Service</span>

 

   在代码清单3-4中,我们先删除之前的测试数据,然后使用在DbContext类中的属性Database中的ExecuteSQlCommand()方法,请注意这里是如何把一个原生的SQL语句传给这个方法的。

  然后,我们创建一个字符串形式的SQL插入语句,这个语句包含了两个参数@Amout和@Vendor。它们只是一个占位符,当SQL语句执行时,会被具体的值给替换掉。

  接下来,我们创建了两个DbParameter类型的参数对象,它们把参数占位符和具体的值绑定在一起。第一个插入,我将值99.97绑定到了占位符Amount上,将值"Ace Plumbing"绑定到占位符Vendor上。随后,我们创建了另一个记录。这里需要注意,这两个参数对象是如何分配到一个DbParameter类型的数组上的。为了执行SQL语句,我们传递包含SQL语句的字符串和DbParameter类型的参数数组给方法ExecuteSqlCommand(),方法ExecueSqlCommand返回SQL语句所影响的行数。在我们的示例中,我们每次调用ExecuteSqlCommand()方法插入一行数据。

  如果你的SQL语句没有任何参数,ExecuteSqlCommand方法有另一个重载方法,它只包含一个接收字符串形式的SQL语句参数。

    代码清单3-4中的模式跟我们在ADO.NET框架中使用SqlClient对象查询数据的方式有点相同。不同的是,我们不需要构造一个连接字符串和显示打开一个数据库连接。实体框架上下文对象会自动完成这项工作。需要注意的是,这里有两个版本的上下文对象:实体框架5、6和4.x中用于Code-First的DbContext上下文对象,和早期版本中的ObjectContext上下文对象。

  需要记住的是,DbContext只是一个简单的包装器或者 “Façade,”(译注:不知道这是什么语言,或许是出版社印刷错误,如果你知道,请留言告之,谢谢!从上下文来看,应该是”外观模式“的意思)它包装了ObjectContext上下文对象,使上下文对象更直接和更易于使用。ObjectContext的所有功能仍然有效。

  表示SQL命令和参数的方式也有不同。在ADO.NET中的ExecuteNonQuery()方法中,命令文本和参数被设置到Command对象上,但在实体框架中传递给ExecuteSqlCommand()方法的是简单类型的参数。

  细心的读者可能已经注意到(这是重点),我们没有查询模型。事实上,正如我们前面提到的那样,我们不需要如图3-3所示的Payment实体。方法ExceuteSqlCommand()只使用DbContext上下文对象,以及连接字符串。

 

最佳实践

  使用参数化SQL语句和不使用参数化SQL语句是一个问题.....。你应该使用参数化的SQL语句,还是动态创建字符串形式的SQL语句呢?最佳实践是,尽可能地使用参数化的SQL语句。原因如下:

  1、参数化SQL语句能帮助阻止SQL注入攻击。如果你使用用户界面上文本框控件中的输入字符,通过动态方式拼接SQL语句。那么你可能无意中就把自己暴露给了SQL注入语句,它会严重地损害你的数据库和泄露敏感信息。当你使用参数化的SQL语句时,它会帮你阻止这种情况的发生。

  2、如果我们在示例中所示,参数化SQL语句,允许重用SQL语句。重用能让我们的代码更加简洁且易于阅读。

  3、很多企业级数据库,像Oracle、DB2以及SQL Server 在某些情况下,它们能凭借参数化查询,重用被解析过的查询语句,即使是参数发生了改变。通过重用,提升了数据库的性能和降低了处理过程。

  4、参数化的SQ语句能让代码更有可维护性和可配置性。例如,SQL语句可以来至配置文件中,这可以让你不修改代码就能改变应用程序。

 

3-3使用原生SQL语句获取对象

问题

  你想使用原生SQL语句从数据库获取对象。

解决方案

  假设你有如图3-4所示的一个拥有Student实体类型的模型。

技术分享

图3-4 一个拥有Student实体类型的模型

  你想通过执行原生的SQL语句返回实体类型Student的实例集合。正如在前面小节中看到的那样,实体框架中的ExecuteSqlCommand()方法和ADO.NET中SQLCommand的ExcuteNonQuery方法有点相似。它执行给定的SQL语句,返回受影响的行数。为了让实体框架实现无类型数据到强类型的实体转换,我可以使用方法SqlQuery()。

  作为开始,本示例凭借实体框架中的Code-First。代码清单3-5,创建了一个Student实体类。

代码清单3-5 Student 实体类

  1. <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Student
  2. {
  3. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> StudentId { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
  4. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> Degree { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
  5. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> FirstName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
  6. </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">string</span> LastName { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
  7. }</span>

 

  接下来,代码清单3-6,创建了用于Code-First的上下文对象。

代码清单3-6 上下文对象DbContext

  1. <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> EFRecipesEntities : DbContext
  2. </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> {
  3. </span><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> EFRecipesEntities()
  4. </span><span style="color: #008080;"> 4</span> : <span style="color: #0000ff;">base</span>(<span style="color: #800000;">"</span><span style="color: #800000;">ConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">)
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> {
  6. </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> }
  7. </span><span style="color: #008080;"> 7</span>
  8. <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">public</span> DbSet<Student> Students { <span style="color: #0000ff;">get</span>; <span style="color: #0000ff;">set</span><span style="color: #000000;">; }
  9. </span><span style="color: #008080;"> 9</span>
  10. <span style="color: #008080;">10</span> <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> OnModelCreating(DbModelBuilder modelBuilder)
  11. </span><span style="color: #008080;">11</span> <span style="color: #000000;"> {
  12. </span><span style="color: #008080;">12</span> modelBuilder.Entity<Student>().ToTable(<span style="color: #800000;">"</span><span style="color: #800000;">Chapter3.Student</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  13. </span><span style="color: #008080;">13</span> <span style="color: #0000ff;">base</span><span style="color: #000000;">.OnModelCreating(modelBuilder);
  14. </span><span style="color: #008080;">14</span> <span style="color: #000000;"> }
  15. </span><span style="color: #008080;">15</span> }

  

  为了执行SQL语句以及返回实体类型Student的实例集合,使用代码清单3-7的模式。

代码清单3-7 使用ExecuteStoreQuery()(译注:应该是使用SqlQuery()方法)方法执行SQL语句并返回对象。

  1. <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> context = <span style="color: #0000ff;">new</span><span style="color: #000000;"> EFRecipesEntities())
  2. </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> {
  3. </span><span style="color: #008080;"> 3</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 删除出测试数据</span>
  4. <span style="color: #008080;"> 4</span> context.Database.ExecuteSqlCommand(<span style="color: #800000;">"</span><span style="color: #800000;">delete from chapter3.student</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  5. </span><span style="color: #008080;"> 5</span>
  6. <span style="color: #008080;"> 6</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 插入数据</span>
  7. <span style="color: #008080;"> 7</span> context.Students.Add(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Student
  8. </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> {
  9. </span><span style="color: #008080;"> 9</span> FirstName = <span style="color: #800000;">"</span><span style="color: #800000;">Robert</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  10. </span><span style="color: #008080;">10</span> LastName = <span style="color: #800000;">"</span><span style="color: #800000;">Smith</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  11. </span><span style="color: #008080;">11</span> Degree = <span style="color: #800000;">"</span><span style="color: #800000;">Masters</span><span style="color: #800000;">"</span>
  12. <span style="color: #008080;">12</span> <span style="color: #000000;"> });
  13. </span><span style="color: #008080;">13</span> context.Students.Add(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Student
  14. </span><span style="color: #008080;">14</span> <span style="color: #000000;"> {
  15. </span><span style="color: #008080;">15</span> FirstName = <span style="color: #800000;">"</span><span style="color: #800000;">Julia</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  16. </span><span style="color: #008080;">16</span> LastName = <span style="color: #800000;">"</span><span style="color: #800000;">Kerns</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  17. </span><span style="color: #008080;">17</span> Degree = <span style="color: #800000;">"</span><span style="color: #800000;">Masters</span><span style="color: #800000;">"</span>
  18. <span style="color: #008080;">18</span> <span style="color: #000000;"> });
  19. </span><span style="color: #008080;">19</span> context.Students.Add(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Student
  20. </span><span style="color: #008080;">20</span> <span style="color: #000000;"> {
  21. </span><span style="color: #008080;">21</span> FirstName = <span style="color: #800000;">"</span><span style="color: #800000;">Nancy</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  22. </span><span style="color: #008080;">22</span> LastName = <span style="color: #800000;">"</span><span style="color: #800000;">Stiles</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  23. </span><span style="color: #008080;">23</span> Degree = <span style="color: #800000;">"</span><span style="color: #800000;">Doctorate</span><span style="color: #800000;">"</span>
  24. <span style="color: #008080;">24</span> <span style="color: #000000;"> });
  25. </span><span style="color: #008080;">25</span> <span style="color: #000000;"> context.SaveChanges();
  26. </span><span style="color: #008080;">26</span> <span style="color: #000000;"> }
  27. </span><span style="color: #008080;">27</span>
  28. <span style="color: #008080;">28</span> <span style="color: #0000ff;">using</span> (<span style="color: #0000ff;">var</span> context = <span style="color: #0000ff;">new</span><span style="color: #000000;"> EFRecipesEntities())
  29. </span><span style="color: #008080;">29</span> <span style="color: #000000;"> {
  30. </span><span style="color: #008080;">30</span> <span style="color: #0000ff;">var</span> sql = <span style="color: #800000;">"</span><span style="color: #800000;">select * from Chapter3.Student where Degree = @Major</span><span style="color: #800000;">"</span><span style="color: #000000;">;
  31. </span><span style="color: #008080;">31</span> <span style="color: #0000ff;">var</span> parameters = <span style="color: #0000ff;">new</span><span style="color: #000000;"> DbParameter[]
  32. </span><span style="color: #008080;">32</span> <span style="color: #000000;"> {
  33. </span><span style="color: #008080;">33</span> <span style="color: #0000ff;">new</span> SqlParameter {ParameterName = <span style="color: #800000;">"</span><span style="color: #800000;">Major</span><span style="color: #800000;">"</span>, Value = <span style="color: #800000;">"</span><span style="color: #800000;">Masters</span><span style="color: #800000;">"</span><span style="color: #000000;">}
  34. </span><span style="color: #008080;">34</span> <span style="color: #000000;"> };
  35. </span><span style="color: #008080;">35</span> <span style="color: #0000ff;">var</span> students = context.Database.SqlQuery<Student><span style="color: #000000;">(sql, parameters);
  36. </span><span style="color: #008080;">36</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">Students...</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  37. </span><span style="color: #008080;">37</span> <span style="color: #0000ff;">foreach</span> (<span style="color: #0000ff;">var</span> student <span style="color: #0000ff;">in</span><span style="color: #000000;"> students)
  38. </span><span style="color: #008080;">38</span> <span style="color: #000000;"> {
  39. </span><span style="color: #008080;">39</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">{0} {1} is working on a {2} degree</span><span style="color: #800000;">"</span><span style="color: #000000;">,
  40. </span><span style="color: #008080;">40</span> <span style="color: #000000;"> student.FirstName, student.LastName, student.Degree);
  41. </span><span style="color: #008080;">41</span> <span style="color: #000000;"> }
  42. </span><span style="color: #008080;">42</span> <span style="color: #000000;"> }
  43. </span><span style="color: #008080;">43</span>
  44. <span style="color: #008080;">44</span> Console.WriteLine(<span style="color: #800000;">"</span><span style="color: #800000;">\nPress <enter> to continue...</span><span style="color: #800000;">"</span><span style="color: #000000;">);
  45. </span><span style="color: #008080;">45</span> <span style="color: #000000;"> Console.ReadLine();
  46. </span><span style="color: #008080;">46</span> }

  代码清单3-7的输出如下:

  1. <span style="color: #008080;">1</span> <span style="color: #000000;">Students...
  2. </span><span style="color: #008080;">2</span> Robert Smith <span style="color: #0000ff;">is</span><span style="color: #000000;"> working on a Masters degree
  3. </span><span style="color: #008080;">3</span> Julia Kerns <span style="color: #0000ff;">is</span> working on a Masters degree

 

原理

  在代码清单3-7中,我们添加了3个Students到DbContext上下文中并使用SaveChanges()方法保存到数据库。

  为了获取正在攻读硕士学位的学生,我们使用了SqlQuery()方法、一个参数化的SQL语句,一个被设置成“Masters.“值的参数。我们枚举返回的Stuendts集合并打印输出。注意相关的上下文对象为这些值实现的变化跟踪。

  这里在查询语句中使用“*”表示所有的例名,实体框架会将返回的列匹配到合适的属性上。一般情况下,这会工作得很好。但是,查询中只有部分列返回时,实体框架会在实例化对象时抛出一个异常。一个更好的方法和最佳实践是,在你的查询语句中显式枚举所有列(也就是说,指定所有的列名)。

  如果你的SQL语句返回的列多于实例化实体所需数量(也就是说,列值数量多于实体对象属性数量),实体框架会忽略掉多于的列。如果你仔细想想,这不是一个令人满意的行为。再一次重申,在SQL语句中显式枚举你所期望返回的列名,确保它们与实体类型匹配

  SqlQuery()方法有很多限制,如果你在使用TPH继承映射,你的SQL语句返回的行要映射到不同的派生类型上,实体框架不能使用鉴别列来将行映射到正确的派生类型。你可能会得到一个运行时异常,因为行中可能不包含正在实例化类型所需的值。

  有趣的是,我们可以使用SqlQuery()方法实例化根本就不是实体的类型。例如,我们创建一个StudentName类,它只包含姓,和名两个属性民。如果我们的SQL语句也只返回这两个列,我们可以使用SqlQuery<StudentName>()方法和指定的SQL语句获取类型StudentName的实例集合。

  我们很小心地使用短语,SQL语句,而不是查询语句,是因为SqlQuer()方法可以接受任何返回行集合的SQL语句。这当然包含查询语句,但也包含执行存储过程的SQL语句。

 

 

 

实体框架交流QQ群:  458326058,欢迎有兴趣的朋友加入一起交流

谢谢大家的持续关注,我的博客地址:http://www.cnblogs.com/VolcanoCloud/

 

《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句

标签:

人气教程排行