2011-06-16 116 views
12

我想挖掘Dapper,似乎缺少一些非常基本的東西,有人可以解釋從谷歌代碼中的Dapper主頁取得的以下代碼,並解釋爲什麼沒有From子句,並且Query方法的第二個參數(動態)傳遞了一個匿名類型,我收集這是以某種方式設置一個命令對象,但是想要一個簡單的術語解釋。微妙的示例代碼的澄清

謝謝 斯蒂芬

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 });    

dog.Count().IsEqualTo(1); 
dog.First().Age.IsNull(); 
dog.First().Id.IsEqualTo(guid); 
+0

我即將對Dapper也有疑問。我想弄清楚如何將一個完全填充的TEntity []數組發送到Execute函數。看看馬克是否在門口探出頭來...... – IAbstract 2011-06-16 23:03:10

+0

@IAbstract:那你爲什麼不問自己的問題呢? – 2011-06-17 12:35:16

+0

@羅伯特:我會......當/如果我弄不清楚的話。這只是一個評論...看到我的意見下的答案:) – IAbstract 2011-06-17 13:13:58

回答

11

前兩個例子只是沒有做任何「真正的」數據訪問,大概是爲了讓他們簡單。
是的,有一個連接使用(connection.Query(...)),但只是因爲這是調用Dapper方法的唯一方法(因爲它們擴展了IDbConnection接口)。

像這樣的東西是完全有效的SQL代碼:

select 'foo', 1 

...它只是「生成」,其在飛行結果,實際上並沒有從表中選擇任何東西。

與參數和匿名類型的例子:

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });

...只是顯示小巧玲瓏的能力to submit SQL parameters in the form of an anonymous type
同樣,查詢實際上並未從表中選擇任何內容,可能是爲了保持簡單。

+0

謝謝基督教。我也假設,因爲他們使用@符號,這是SQL Server的方言?我應該用@ for:替換@ for Oracle嗎? – 2011-06-16 23:16:54

+0

對不起,我重讀了你使用Oracle的事實(我使用SQL Server,而不知道Oracle)。是的,「@」表示一個SQL參數。由於Dapper本身完全獨立於數據庫(http://code.google.com/p/dapper-dot-net/#Will_dapper_work_with_my_db_provider),因此您必須使用與Oracle相同的「@」。 – 2011-06-16 23:23:23

+0

+1:很好的信息......對於MySql,我會用'?'替換'@'。不是嗎? – IAbstract 2011-06-16 23:34:48