ตั้งอยู่ที่ https://github.com/dapperlib/dapper/releases
ฟีดรีลีสล่วงหน้าของ MyGet: https://www.myget.org/gallery/dapper
บรรจุุภัณฑ์ | Nuget เสถียร | Nuget Pre-release | การดาวน์โหลด | ของฉัน |
---|---|---|---|---|
คนขี้เกียจ | ||||
dapper.entityframework | ||||
dapper.entityframework.strongname | ||||
dapper.rainbow | ||||
dapper.sqlbuilder | ||||
dapper.strongname |
วัตถุประสงค์ของแพ็คเกจ:
Dapper ได้รับการพัฒนา แต่เดิมและโดยสแต็กล้น แต่เป็น f/oss การสนับสนุนยินดีต้อนรับและเชิญ - ดูลิงค์สปอนเซอร์ที่ด้านบนของหน้า ขอขอบคุณทุกคน (บุคคลหรือองค์กร) ที่ได้รับการสนับสนุนจาก Dapper แต่เป็นขอบคุณมากโดยเฉพาะ:
Dapper เป็นไลบรารี NUGET ที่คุณสามารถเพิ่มลงในโครงการของคุณที่จะปรับปรุงการเชื่อมต่อ ADO.NET ของคุณผ่านวิธีการขยายในอินสแตนซ์การเชื่อมต่อ DbConnection
ของคุณ สิ่งนี้ให้ API ที่เรียบง่ายและมีประสิทธิภาพสำหรับการเรียกใช้ SQL โดยรองรับการเข้าถึงข้อมูลแบบซิงโครนัสและอะซิงโครนัสและช่วยให้ทั้งแบบสอบถามทั้งบัฟเฟอร์และแบบไม่บัฟเฟอร์
มันมีผู้ช่วยหลายคน แต่ API ที่สำคัญคือ:
// insert/update/delete etc
var count = connection . Execute ( sql [ , args ] ) ;
// multi-row query
IEnumerable < T > rows = connection . Query < T > ( sql [ , args ] ) ;
// single-row query ({Single|First}[OrDefault])
T row = connection . QuerySingle < T > ( sql [ , args ] ) ;
ที่ args
สามารถอยู่ที่ไหน (เหนือสิ่งอื่นใด):
Dictionary<string,object>
DynamicParameters
public class Dog
{
public int ? Age { get ; set ; }
public Guid Id { get ; set ; }
public string Name { get ; set ; }
public float ? Weight { get ; set ; }
public int IgnoredProperty { get { return 1 ; } }
}
var guid = Guid . NewGuid ( ) ;
var dog = connection . Query < Dog > ( " select Age = @Age, Id = @Id " , new { Age = ( int ? ) null , Id = guid } ) ;
Assert . Equal ( 1 , dog . Count ( ) ) ;
Assert . Null ( dog . First ( ) . Age ) ;
Assert . Equal ( guid , dog . First ( ) . Id ) ;
วิธีนี้จะดำเนินการ SQL และส่งคืนรายการแบบไดนามิก
ตัวอย่างการใช้งาน:
var rows = connection . Query ( " select 1 A, 2 B union all select 3, 4 " ) . AsList ( ) ;
Assert . Equal ( 1 , ( int ) rows [ 0 ] . A ) ;
Assert . Equal ( 2 , ( int ) rows [ 0 ] . B ) ;
Assert . Equal ( 3 , ( int ) rows [ 1 ] . A ) ;
Assert . Equal ( 4 , ( int ) rows [ 1 ] . B ) ;
ตัวอย่างการใช้งาน:
var count = connection . Execute ( @"
set nocount on
create table #t(i int)
set nocount off
insert #t
select @a a union all select @b
set nocount on
drop table #t" , new { a = 1 , b = 2 } ) ;
Assert . Equal ( 2 , count ) ;
ลายเซ็นเดียวกันยังช่วยให้คุณสามารถดำเนินการคำสั่งได้อย่างสะดวกและมีประสิทธิภาพหลายครั้ง (ตัวอย่างเช่นข้อมูลโหลดจำนวนมาก)
ตัวอย่างการใช้งาน:
var count = connection . Execute ( @"insert MyTable(colA, colB) values (@a, @b)" ,
new [ ] { new { a = 1 , b = 1 } , new { a = 2 , b = 2 } , new { a = 3 , b = 3 } }
) ;
Assert . Equal ( 3 , count ) ; // 3 rows inserted: "1,1", "2,2" and "3,3"
อีกตัวอย่างการใช้งานเมื่อคุณมีคอลเลกชันที่มีอยู่ แล้ว :
var foos = new List < Foo >
{
{ new Foo { A = 1 , B = 1 } }
{ new Foo { A = 2 , B = 2 } }
{ new Foo { A = 3 , B = 3 } }
} ;
var count = connection . Execute ( @"insert MyTable(colA, colB) values (@a, @b)" , foos ) ;
Assert . Equal ( foos . Count , count ) ;
สิ่งนี้ใช้ได้กับพารามิเตอร์ใด ๆ ที่ใช้ IEnumerable<T>
สำหรับบาง T.
คุณสมบัติที่สำคัญของ Dapper คือประสิทธิภาพ ตัวชี้วัดต่อไปนี้แสดงระยะเวลาที่ใช้ในการเรียกใช้คำสั่ง SELECT
กับ DB (ในการกำหนดค่าต่างๆแต่ละรายการ) และแมปข้อมูลที่ส่งกลับไปยังวัตถุ
มาตรฐานสามารถพบได้ใน dapper.tests.performance (ยินดีต้อนรับผลงาน!) และสามารถเรียกใช้ผ่าน:
dotnet run --project . b enchmarks D apper.Tests.Performance -c Release -f net8.0 -- -f * --join
ผลลัพธ์จากการรันล่าสุดคือ:
BenchmarkDotNet v0.13.7, Windows 10 (10.0.19045.3693/22H2/2022Update)
Intel Core i7-3630QM CPU 2.40GHz (Ivy Bridge), 1 CPU, 8 logical and 4 physical cores
.NET SDK 8.0.100
[Host] : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX
ShortRun : .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX
orm | วิธี | กลับ | หมายถึง | stddev | ข้อผิดพลาด | Gen0 | Gen1 | Gen2 | จัดสรร |
---|---|---|---|---|---|---|---|---|---|
Dapper Cache Impact | ExecuteParameters_Cache | โมฆะ | 96.75 เรา | 0.668 US | 1.010 US | 0.6250 | - | - | 2184 b |
Dapper Cache Impact | queryfirstparameters_cache | โมฆะ | 96.86 เรา | 0.493 เรา | 0.746 เรา | 0.8750 | - | - | 2824 b |
เขียนด้วยมือ | sqlcommand | โพสต์ | 119.70 เรา | 0.706 เรา | 1.067 เรา | 1.3750 | 1.0000 | 0.1250 | 7584 b |
เขียนด้วยมือ | ที่เก็บข้อมูลได้ | พลวัต | 126.64 เรา | 1.239 เรา | 1.873 เรา | 3.0000 | - | - | 9576 B |
sqlmarshal | sqlcommand | โพสต์ | 132.36 เรา | 1.008 US | 1.523 เรา | 2.0000 | 1.0000 | 0.2500 | 11529 B |
คนขี้เกียจ | queryfirstordefault | โพสต์ | 133.73 เรา | 1.301 เรา | 2.186 เรา | 1.7500 | 1.5000 | - | 11608 B |
อันยิ่งใหญ่ | สอบถาม | พลวัต | 133.92 เรา | 1.075 เรา | 1.806 เรา | 2.0000 | 1.7500 | - | 12710 b |
linq ถึง db | สอบถาม | โพสต์ | 134.24 เรา | 1.068 US | 1.614 เรา | 1.7500 | 1.2500 | - | 10904 B |
การปรับแต่ง | ExecuteQuery | โพสต์ | 135.83 เรา | 1.839 เรา | 3.091 เรา | 1.7500 | 1.5000 | - | 11649 B |
คนขี้เกียจ | 'คำถาม (บัฟเฟอร์)' | โพสต์ | 136.14 เรา | 1.755 เรา | 2.653 เรา | 2.0000 | 1.5000 | - | 11888 b |
อันยิ่งใหญ่ | สอบถาม | โพสต์ | 137.96 เรา | 1.485 เรา | 2.244 เรา | 2.2500 | 1.2500 | - | 12201 B |
คนขี้เกียจ | queryfirstordefault | พลวัต | 139.04 เรา | 1.507 เรา | 2.279 เรา | 3.5000 | - | - | 11648 b |
อันยิ่งใหญ่ | จากการศึกษาครั้งเดียว | พลวัต | 139.74 เรา | 2.521 เรา | 3.811 US | 2.0000 | 1.7500 | - | 12710 b |
คนขี้เกียจ | 'คำถาม (บัฟเฟอร์)' | พลวัต | 140.13 เรา | 1.382 เรา | 2.090 เรา | 2.0000 | 1.5000 | - | 11968 b |
ผู้ให้บริการ | โดยเฉพาะ | โพสต์ | 140.76 เรา | 1.147 เรา | 2.192 เรา | 2.5000 | 1.2500 | 0.2500 | 15248 b |
คนขี้เกียจ | 'Contrib Get' | โพสต์ | 141.09 เรา | 1.394 เรา | 2.108 เรา | 2.0000 | 1.5000 | - | 12440 b |
อันยิ่งใหญ่ | จากการศึกษาครั้งเดียว | โพสต์ | 141.17 เรา | 1.941 เรา | 2.935 เรา | 1.7500 | 1.5000 | - | 12201 B |
มโหฬาร | 'Query (Dynamic)' | พลวัต | 142.01 เรา | 4.957 เรา | 7.494 เรา | 2.0000 | 1.5000 | - | 12342 b |
linq ถึง db | 'First (รวบรวม)' | โพสต์ | 144.59 เรา | 1.295 เรา | 1.958 เรา | 1.7500 | 1.5000 | - | 12128 b |
การปรับแต่ง | Queryfield | โพสต์ | 148.31 เรา | 1.742 เรา | 2.633 เรา | 2.0000 | 1.5000 | 0.5000 | 13938 b |
บรรทัดฐาน | 'อ่าน <> (tuples)' | Valuetuple`8 | 148.58 เรา | 2.172 เรา | 3.283 เรา | 2.0000 | 1.7500 | - | 12745 b |
บรรทัดฐาน | 'อ่าน <()> (ชื่อ tuples)' | Valuetuple`8 | 150.60 เรา | 0.658 US | 1.106 เรา | 2.2500 | 2.0000 | 1.2500 | 14562 b |
การปรับแต่ง | สอบถาม | โพสต์ | 152.34 เรา | 2.164 เรา | 3.271 เรา | 2.2500 | 1.5000 | 0.2500 | 14106 b |
การปรับแต่ง | querydynamic | โพสต์ | 154.15 เรา | 4.108 เรา | 6.210 US | 2.2500 | 1.7500 | 0.5000 | 13930 b |
การปรับแต่ง | สอบถามได้ทุกที่ | โพสต์ | 155.90 เรา | 1.953 เรา | 3.282 เรา | 2.5000 | 0.5000 | - | 14858 b |
Dapper Cache Impact | Executenoparameters_nocache | โมฆะ | 162.35 เรา | 1.584 เรา | 2.394 เรา | - | - | - | 760 b |
Dapper Cache Impact | Executenoparameters_cache | โมฆะ | 162.42 เรา | 2.740 เรา | 4.142 เรา | - | - | - | 760 b |
Dapper Cache Impact | queryfirstnoparameters_cache | โมฆะ | 164.35 เรา | 1.206 เรา | 1.824 เรา | 0.2500 | - | - | 1520 b |
DevExpress.xpo | findObject | โพสต์ | 165.87 เรา | 1.012 US | 1.934 เรา | 8.5000 | - | - | 28099 B |
Dapper Cache Impact | queryfirstnoparameters_nocache | โมฆะ | 173.87 เรา | 1.178 เรา | 1.781 เรา | 0.5000 | - | - | 1576 b |
linq ถึง db | อันดับแรก | โพสต์ | 175.21 เรา | 2.292 เรา | 3.851 เรา | 2.0000 | 0.5000 | - | 14041 B |
EF 6 | sqlQuery | โพสต์ | 175.36 เรา | 2.259 เรา | 3.415 เรา | 4.0000 | 0.7500 | - | 24209 B |
บรรทัดฐาน | 'อ่าน <> (คลาส)' | โพสต์ | 186.37 เรา | 1.305 เรา | 2.496 เรา | 3.0000 | 0.5000 | - | 17579 B |
DevExpress.xpo | getObjectByKey | โพสต์ | 186.78 เรา | 3.407 เรา | 5.151 เรา | 4.5000 | 1.0000 | - | 30114 b |
คนขี้เกียจ | 'Query (uncondered)' | พลวัต | 194.62 เรา | 1.335 เรา | 2.019 เรา | 1.7500 | 1.5000 | - | 12048 b |
คนขี้เกียจ | 'Query (uncondered)' | โพสต์ | 195.01 เรา | 0.888 US | 1.343 เรา | 2.0000 | 1.5000 | - | 12008 b |
DevExpress.xpo | สอบถาม | โพสต์ | 199.46 เรา | 5.500 US | 9.243 เรา | 10.0000 | - | - | 32083 B |
เบลเกรด | Firstordefault | งาน `1 | 228.70 เรา | 2.181 เรา | 3.665 เรา | 4.5000 | 0.5000 | - | 20555 b |
EF Core | 'First (รวบรวม)' | โพสต์ | 265.45 เรา | 17.745 เรา | 26.828 เรา | 2.0000 | - | - | 7521 B |
ผู้มีอำนาจเหนือกว่า | รับ | โพสต์ | 276.02 เรา | 8.029 เรา | 12.139 เรา | 6.5000 | 1.0000 | - | 29885 B |
ผู้มีอำนาจเหนือกว่า | HQL | โพสต์ | 277.74 เรา | 13.032 เรา | 19.703 เรา | 8.0000 | 1.0000 | - | 31886 B |
ผู้มีอำนาจเหนือกว่า | เกณฑ์ | โพสต์ | 300.22 เรา | 14.908 เรา | 28.504 เรา | 13.0000 | 1.0000 | - | 57562 B |
EF 6 | อันดับแรก | โพสต์ | 310.55 เรา | 27.254 เรา | 45.799 เรา | 13.0000 | - | - | 43309 B |
EF Core | อันดับแรก | โพสต์ | 317.12 เรา | 1.354 เรา | 2.046 เรา | 3.5000 | - | - | 11306 b |
EF Core | sqlQuery | โพสต์ | 322.34 เรา | 23.990 เรา | 40.314 เรา | 5.0000 | - | - | 18195 b |
ผู้มีอำนาจเหนือกว่า | SQL | โพสต์ | 325.54 เรา | 3.937 เรา | 7.527 เรา | 22.0000 | 1.0000 | - | 80007 B |
EF 6 | 'ก่อน (ไม่มีการติดตาม)' | โพสต์ | 331.14 เรา | 27.760 เรา | 46.649 เรา | 12.0000 | 1.0000 | - | 50237 B |
EF Core | 'ก่อน (ไม่มีการติดตาม)' | โพสต์ | 337.82 เรา | 27.814 เรา | 46.740 เรา | 3.0000 | 1.0000 | - | 17986 b |
ผู้มีอำนาจเหนือกว่า | linq | โพสต์ | 604.74 เรา | 5.549 เรา | 10.610 เรา | 10.0000 | - | - | 46061 B |
Dapper Cache Impact | ExecuteParameters_nocache | โมฆะ | 623.42 เรา | 3.978 เรา | 6.684 เรา | 3.0000 | 2.0000 | - | 1,0001 b |
Dapper Cache Impact | queryfirstparameters_nocache | โมฆะ | 630.77 เรา | 3.027 เรา | 4.576 เรา | 3.0000 | 2.0000 | - | 10640 b |
อย่าลังเลที่จะส่งแพตช์ที่มี ORMS อื่น ๆ - เมื่อเรียกใช้เกณฑ์มาตรฐานให้แน่ใจว่าได้รวบรวมในการเปิดตัวและไม่แนบดีบักเกอร์ ( CTRL + F5 )
หรือคุณอาจชอบชุดทดสอบ RawDataAccessBencher ของ Frans Bouma หรือ Ormbenchmark
พารามิเตอร์มักจะถูกส่งผ่านในชั้นเรียนที่ไม่ระบุชื่อ สิ่งนี้ช่วยให้คุณสามารถตั้งชื่อพารามิเตอร์ของคุณได้อย่างง่ายดายและให้ความสามารถในการตัดและวางตัวอย่าง SQL และเรียกใช้ในเครื่องวิเคราะห์การสืบค้นแพลตฟอร์ม DB ของคุณ
new { A = 1 , B = " b " } // A will be mapped to the param @A, B to the param @B
พารามิเตอร์สามารถสร้างขึ้นได้แบบไดนามิกโดยใช้คลาส DynamicParameters สิ่งนี้ช่วยให้สามารถสร้างคำสั่ง SQL แบบไดนามิกในขณะที่ยังคงใช้พารามิเตอร์เพื่อความปลอดภัยและประสิทธิภาพ
var sqlPredicates = new List < string > ( ) ;
var queryParams = new DynamicParameters ( ) ;
if ( boolExpression )
{
sqlPredicates . Add ( " column1 = @param1 " ) ;
queryParams . Add ( " param1 " , dynamicValue1 , System . Data . DbType . Guid ) ;
} else {
sqlPredicates . Add ( " column2 = @param2 " ) ;
queryParams . Add ( " param2 " , dynamicValue2 , System . Data . DbType . String ) ;
}
DynamicParameters ยังรองรับการคัดลอกพารามิเตอร์หลายตัวจากวัตถุที่มีอยู่ในประเภทต่าง ๆ
var queryParams = new DynamicParameters ( objectOfType1 ) ;
queryParams . AddDynamicParams ( objectOfType2 ) ;
เมื่อวัตถุที่ใช้อินเทอร์เฟซ IDynamicParameters
ที่ส่งผ่านไปยังฟังก์ชั่น Execute
หรือ Query
ค่าพารามิเตอร์จะถูกแยกผ่านอินเตอร์เฟสนี้ เห็นได้ชัดว่าคลาสวัตถุที่เป็นไปได้มากที่สุดที่จะใช้เพื่อจุดประสงค์นี้คือคลาส DynamicParameters
ในตัว
Dapper ช่วยให้คุณผ่าน IEnumerable<int>
และจะกำหนดพารามิเตอร์แบบสอบถามของคุณโดยอัตโนมัติ
ตัวอย่างเช่น:
connection . Query < int > ( " select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids " , new { Ids = new int [ ] { 1 , 2 , 3 } } ) ;
จะแปลเป็น:
select * from ( select 1 as Id union all select 2 union all select 3 ) as X where Id in ( @Ids1 , @Ids2 , @Ids3 ) " // @Ids1 = 1 , @Ids2 = 2 , @Ids2 = 3
Dapper รองรับการเปลี่ยนตัวอักษรสำหรับประเภทบูลและตัวเลข
connection . Query ( " select * from User where UserTypeId = {=Admin} " , new { UserTypeId . Admin } ) ;
การเปลี่ยนตัวอักษรไม่ได้ถูกส่งเป็นพารามิเตอร์ สิ่งนี้จะช่วยให้แผนการที่ดีขึ้นและการใช้ดัชนีที่ผ่านการกรอง แต่ควรใช้เท่าที่จำเป็นและหลังการทดสอบ คุณลักษณะนี้มีประโยชน์อย่างยิ่งเมื่อค่าที่ถูกฉีดเป็นค่าคงที่ (ตัวอย่างเช่น "หมวดหมู่ ID" คงที่ "รหัสสถานะ" หรือ "ภูมิภาค" ที่เฉพาะเจาะจงซึ่งเฉพาะเจาะจงกับการสืบค้น) สำหรับข้อมูล สด ที่คุณกำลังพิจารณาตัวอักษรคุณ อาจ ต้องการพิจารณาและทดสอบคำแนะนำการสืบค้นเฉพาะผู้ให้บริการที่เฉพาะเจาะจงเช่น OPTIMIZE FOR UNKNOWN
ด้วยพารามิเตอร์ปกติ
พฤติกรรมเริ่มต้นของ Dapper คือการเรียกใช้ SQL และบัฟเฟอร์ผู้อ่านทั้งหมดของคุณเมื่อผลตอบแทน นี่เป็นสิ่งที่เหมาะอย่างยิ่งในกรณีส่วนใหญ่เนื่องจากจะช่วยลดการล็อคที่ใช้ร่วมกันใน DB และลดเวลาเครือข่าย DB
อย่างไรก็ตามเมื่อดำเนินการสืบค้นขนาดใหญ่คุณอาจจำเป็นต้องลดรอยเท้าหน่วยความจำและโหลดวัตถุตามต้องการเท่านั้น ในการทำเช่นนั้น buffered: false
ในวิธี Query
Dapper อนุญาตให้คุณแมปแถวเดียวกับหลาย ๆ วัตถุ นี่คือคุณสมบัติที่สำคัญหากคุณต้องการหลีกเลี่ยงการสืบค้นภายนอกและการเชื่อมโยงโหลดที่กระตือรือร้น
ตัวอย่าง:
พิจารณา 2 คลาส: Post
และ User
class Post
{
public int Id { get ; set ; }
public string Title { get ; set ; }
public string Content { get ; set ; }
public User Owner { get ; set ; }
}
class User
{
public int Id { get ; set ; }
public string Name { get ; set ; }
}
ตอนนี้ให้เราบอกว่าเราต้องการแมปแบบสอบถามที่เข้าร่วมทั้งโพสต์และตารางผู้ใช้ จนถึงตอนนี้ถ้าเราต้องการรวมผลลัพธ์ของการสืบค้น 2 ครั้งเราจำเป็นต้องมีวัตถุใหม่เพื่อแสดง แต่มันก็สมเหตุสมผลในกรณีนี้ที่จะนำวัตถุ User
ไว้ในวัตถุ Post
นี่คือกรณีการใช้งานสำหรับการแมปหลาย คุณบอก Dapper ว่าแบบสอบถามส่งคืน Post
และวัตถุ User
จากนั้นให้ฟังก์ชั่นที่อธิบายสิ่งที่คุณต้องการทำกับแต่ละแถวที่มีทั้ง Post
และวัตถุ User
ในกรณีของเราเราต้องการนำวัตถุผู้ใช้และวางไว้ในวัตถุโพสต์ ดังนั้นเราจึงเขียนฟังก์ชั่น:
( post , user ) => { post . Owner = user ; return post ; }
อาร์กิวเมนต์ 3 ประเภทไปยังวิธี Query
ระบุว่าวัตถุใดที่ Dapper ควรใช้เพื่อ deserialize แถวและสิ่งที่จะส่งคืน เราจะตีความทั้งสองแถวเป็นการรวมกันของ Post
และ User
และเราจะกลับไปที่วัตถุ Post
ดังนั้นการประกาศประเภทจะกลายเป็น
< Post , User , Post >
ทุกอย่างรวมกันดูเหมือนว่า:
var sql =
@"select * from #Posts p
left join #Users u on u.Id = p.OwnerId
Order by p.Id" ;
var data = connection . Query < Post , User , Post > ( sql , ( post , user ) => { post . Owner = user ; return post ; } ) ;
var post = data . First ( ) ;
Assert . Equal ( " Sams Post1 " , post . Content ) ;
Assert . Equal ( 1 , post . Id ) ;
Assert . Equal ( " Sam " , post . Owner . Name ) ;
Assert . Equal ( 99 , post . Owner . Id ) ;
Dapper สามารถแยกแถวที่ส่งคืนได้โดยตั้งสมมติฐานว่าคอลัมน์ ID ของคุณมีชื่อว่า Id
หรือ id
หากคีย์หลักของคุณแตกต่างกันหรือคุณต้องการแยกแถวที่จุดอื่นนอกเหนือจาก Id
ให้ใช้พารามิเตอร์ splitOn
เสริม
Dapper ช่วยให้คุณสามารถประมวลผลกริดผลลัพธ์ได้หลายกริดในแบบสอบถามเดียว
ตัวอย่าง:
var sql =
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id" ;
using ( var multi = connection . QueryMultiple ( sql , new { id = selectedId } ) )
{
var customer = multi . Read < Customer > ( ) . Single ( ) ;
var orders = multi . Read < Order > ( ) . ToList ( ) ;
var returns = multi . Read < Return > ( ) . ToList ( ) ;
.. .
}
Dapper รองรับ Procs ที่เก็บไว้อย่างเต็มที่:
var user = cnn . Query < User > ( " spGetUser " , new { Id = 1 } ,
commandType : CommandType . StoredProcedure ) . SingleOrDefault ( ) ;
หากคุณต้องการอะไรแฟนซีมากขึ้นคุณสามารถทำได้:
var p = new DynamicParameters ( ) ;
p . Add ( " @a " , 11 ) ;
p . Add ( " @b " , dbType : DbType . Int32 , direction : ParameterDirection . Output ) ;
p . Add ( " @c " , dbType : DbType . Int32 , direction : ParameterDirection . ReturnValue ) ;
cnn . Execute ( " spMagicProc " , p , commandType : CommandType . StoredProcedure ) ;
int b = p . Get < int > ( " @b " ) ;
int c = p . Get < int > ( " @c " ) ;
Dapper รองรับ Varchar Params หากคุณกำลังดำเนินการตามประโยคในคอลัมน์ Varchar โดยใช้พารามิเตอร์ให้แน่ใจว่าจะส่งผ่านด้วยวิธีนี้:
Query < Thing > ( " select * from Thing where Name = @Name " , new { Name = new DbString { Value = " abcde " , IsFixedLength = true , Length = 10 , IsAnsi = true } } ) ;
บน SQL Server เป็นสิ่งสำคัญที่จะต้องใช้ Unicode เมื่อสอบถาม Unicode และ ANSI เมื่อสอบถามที่ไม่ใช่ Unicode
โดยปกติแล้วคุณจะต้องปฏิบัติต่อทุกแถวจากตารางที่กำหนดเป็นชนิดข้อมูลเดียวกัน อย่างไรก็ตามมีบางสถานการณ์ที่มีประโยชน์ในการวิเคราะห์แถวต่าง ๆ เป็นประเภทข้อมูลที่แตกต่างกัน นี่คือที่ IDataReader.GetRowParser
มีประโยชน์
ลองนึกภาพคุณมีตารางฐานข้อมูลที่ชื่อว่า "รูปร่าง" พร้อมคอลัมน์: Id
, Type
และ Data
และคุณต้องการแยกแถวของมันเป็น Circle
Square
หรือวัตถุ Triangle
ตามค่าของคอลัมน์ประเภท
var shapes = new List < IShape > ( ) ;
using ( var reader = connection . ExecuteReader ( " select * from Shapes " ) )
{
// Generate a row parser for each type you expect.
// The generic type <IShape> is what the parser will return.
// The argument (typeof(*)) is the concrete type to parse.
var circleParser = reader . GetRowParser < IShape > ( typeof ( Circle ) ) ;
var squareParser = reader . GetRowParser < IShape > ( typeof ( Square ) ) ;
var triangleParser = reader . GetRowParser < IShape > ( typeof ( Triangle ) ) ;
var typeColumnIndex = reader . GetOrdinal ( " Type " ) ;
while ( reader . Read ( ) )
{
IShape shape ;
var type = ( ShapeType ) reader . GetInt32 ( typeColumnIndex ) ;
switch ( type )
{
case ShapeType . Circle :
shape = circleParser ( reader ) ;
break ;
case ShapeType . Square :
shape = squareParser ( reader ) ;
break ;
case ShapeType . Triangle :
shape = triangleParser ( reader ) ;
break ;
default :
throw new NotImplementedException ( ) ;
}
shapes . Add ( shape ) ;
}
}
ในการใช้ตัวแปร SQL ที่ไม่ใช่พารามิเตอร์กับตัวเชื่อมต่อ MySQL คุณต้องเพิ่มตัวเลือกต่อไปนี้ในสตริงการเชื่อมต่อของคุณ:
Allow User Variables=True
ตรวจสอบให้แน่ใจว่าคุณไม่ได้จัดเตรียมคุณสมบัติให้กับแผนที่
Dapper แคชข้อมูลเกี่ยวกับการสืบค้นทุกครั้งที่ทำงานซึ่งจะช่วยให้สามารถทำให้วัตถุเป็นรูปธรรมได้อย่างรวดเร็วและประมวลผลพารามิเตอร์อย่างรวดเร็ว การใช้งานปัจจุบันแคชข้อมูลนี้ในวัตถุ ConcurrentDictionary
ข้อความที่ใช้เพียงครั้งเดียวจะถูกล้างออกจากแคชนี้เป็นประจำ ถึงกระนั้นหากคุณกำลังสร้างสตริง SQL ทันทีโดยไม่ใช้พารามิเตอร์เป็นไปได้ที่คุณอาจตีปัญหาหน่วยความจำ
ความเรียบง่ายของ Dapper หมายความว่าคุณสมบัติหลายอย่างที่ Orms Ship With ถูกถอดออก มันกังวลเกี่ยวกับสถานการณ์ 95% และให้เครื่องมือที่คุณต้องการเกือบตลอดเวลา มันไม่ได้พยายามแก้ปัญหาทุกอย่าง
Dapper ไม่มีรายละเอียดการใช้งานเฉพาะของ DB ทำงานได้กับผู้ให้บริการ. NET ADO ทั้งหมดรวมถึง SQLite, SQL CE, Firebird, Oracle, MariADB, MySQL, PostgreSQL และ SQL Server
Dapper มีชุดทดสอบที่ครอบคลุมในโครงการทดสอบ
Dapper ใช้งานการผลิตที่สแต็กล้น