2011-11-22 24 views
20

anonim nesnelerZarif dinamik parametreler (C# Bu kod Zarif Dot Net kullanıyor)

Bu kod çalışır kullanmadığınız zamanlarda "skaler değişken tanımlamak gerekir" Bir SQLException atmak SqlException:

class MyAccount 
{ 
    public string Name; 
    public int Priority; 
} 

var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; 
var acct = new MyAccount { Name = "helloworld", Priority = 10 }; 
connection_.Execute(command, acct); 

System.Data.SqlClient.SqlException: skaler değişken "@Priority" ilan olmalı.

Neden?

class MyAccount 
{ 
    public string Name { get; set; } 
    public int Priority { get; set; } 
} 

Dapper alanlarını göz ardı parametreleri almak için nesnesinin özellikleri bakar:

cevap

27

özellikleri, alanlar değil ile modelinizi uygulayın. Anonim türler, implemented with properties oldukları için çalışır.

+1

; materyalizasyon için alanları göz önünde bulundururuz, bu yüzden parametrelendirme için o zaman izin vermeyeceğimiz biraz tutarsızlık (en azından kamuya açık olanlar). Meh ... Yine de haklısın - özelliklerin doğru kullanımı ile çözmek için önemsiz. –

+2

@MarcGravell en az sürpriz ilkesini ihlal ediyor gibi görünüyor. Davranışı değiştirmek veya gerekliliği belgelemek için oy kullanırdım. –

1

Ayrıca veri türünde de aynı sorun var. Bir DateTime özelliğine sahip dinamik nesne ile bir sorgu oluştururken, özel durum: System.Object türündeki üye oluşturulanDeğeri parametre değeri olarak kullanılamaz.

Daha sonra dinamik yerine bir POCO kullandığımda çalıştı.

1

Bu yanıt, posterin sorunuyla ilgili olmasa da, burada paylaşacağım farklı bir düzeltmeyle benzer bir sorun yaşadım.

Ben yanlış bir new []{ ... } olarak parametre listesi tanımlayan edildi:

var name = "myName"; 
var priority = 1; 
var command = "UPDATE account SET priority_id = @Priority WHERE name = @Name"; 
connection_.Execute(command, new []{ priority, name }); 

[] sorunumu çözdü bırakarak: İlginç

connection_.Execute(command, new { priority, name });