Dapper學習(二)之Query相關

  • 2019 年 10 月 3 日
  • 筆記

 

0. FIrst , Single & Default

使用這個方法時要小心,First 和 Single 是不同的。

 這裡,對這個表做下說明:

如果使用 First , 當沒有查到元素時,會報錯;如果查到一個元素,會返回這個元素;如果查到多個元素,會返回第一個元素;

如果使用 Single , 沒有查到元素會報錯;查到一個元素,則返回這個元素;查到多個元素,則報錯;

如果使用 FirstOrDefault , 沒有查到元素會返回默認值;如果查到一個元素,則返回這個元素;如果查到多個元素,則返回第一個元素;

如果使用 SingleOrDefault , 沒有查到元素返回默認值;如果查到一個元素,則返回這個元素;如果查到多個元素,則報錯;

1. QueryFirst

可以用來查詢和映射第一個結果

結果可以被映射到:

  • Anonymous
  • Strongly Typed

參數

1.1 Query Anonymous

執行一個查詢,並且映射第一個結果到一個動態集合

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QueryFirst(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(orderDetail);  }

1.2 Query Strongly Typed

執行一個查詢,並且映射第一個結果到一個強類型集合

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QueryFirst<OrderDetail>(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(orderDetail);  }

2. QueryFirstOrDefault

執行一個查詢,並且映射第一個結果,或者如果沒查到元素時,返回一個默認值

結果可以被映射到:

  • Anonymous
  • Strongly Typed

參數

 2.1 Query Anonymous

執行一個查詢,並且映射第一個結果到一個動態集合,或者如果沒查到元素,則返回一個默認值

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QueryFirstOrDefault(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(orderDetail);  }

2.2 Query Strongly Typed

執行一個查詢,並且映射第一個結果到一個強類型集合,或者如果沒查到元素,則返回一個默認值

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QueryFirstOrDefault<OrderDetail>(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });  }

3. QuerySingle

執行查詢,並且映射第一個結果,如果查到不止一個元素,則會拋出異常

結果可以映射到:

  • Anonymous
  • Strongly Typed

參數

 3.1 Query Anonymous

執行查詢,映射第一個結果到一個動態集合,如果查到不止一個元素,拋出異常

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QuerySingle(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(orderDetail);  }

3.2 Query Strongly Typed

執行查詢,並且映射第一個結果到一個強類型集合,如果查到不止一個元素,則拋出異常

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QuerySingle<OrderDetail>(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });  }

4. QuerySingleOrDefault

執行查詢,並且映射第一個結果,或者如果查詢結果為空,則返回默認值;如果查到不止一個元素,則拋出異常

結果映射到:

  • Anonymous
  • Strongly Typed

參數

 4.1 Query Anonymous

執行查詢,並且映射第一個結果到一個動態集合,或者如果查詢結果為空,則返回一個默認值;如果查到不止一個元素,則拋出異常。

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QuerySingleOrDefault(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(orderDetail);  }

4.2 Query Strongly Typed

執行查詢,並且映射第一個結果到一個強類型集合,或者如果查詢結果為空,則返回一個默認值;如果查到不止一個元素,則拋出異常

string sql = "SELECT * FROM OrderDetails WHERE OrderDetailID = @OrderDetailID;";    using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))  {      var orderDetail = connection.QuerySingleOrDefault<OrderDetail>(sql, new {OrderDetailID = 1});        FiddleHelper.WriteTable(new List<OrderDetail>() { orderDetail });  }

5. QueryMultiple

它可以在同一個命令中執行多個查詢,並且映射到結果中

string sql = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID; SELECT * FROM InvoiceItem WHERE InvoiceID = @InvoiceID;";    using (var connection = My.ConnectionFactory())  {      connection.Open();        using (var multi = connection.QueryMultiple(sql, new {InvoiceID = 1}))      {          var invoice = multi.Read<Invoice>().First();          var invoiceItems = multi.Read<InvoiceItem>().ToList();      }  }

參數