2011-06-16 86 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