Dapper示例代码的澄清

12

我试图理解Dapper,但好像缺少非常基本的东西,请问有人能够解释来自Dapper官网的以下代码并且解释为什么没有From子句,以及查询方法(Query)的第二个参数(动态参数类型)被传递了一个匿名类型。我猜这在某种程度上是设置命令对象,但希望能用简单易懂的术语进行解释。

谢谢, Stephen

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

我也即将有一个关于Dapper的问题。我正在尝试弄清楚如何将一个完全填充的TEntity[]数组发送到Execute函数。期待Marc能够出现... - IAbstract
@IAbstract:那你为什么不问自己的问题呢? - Robert Koritnik
@Robert:如果我无法解决它,我会……只是一条评论……请看我的回答下面的评论 :) - IAbstract
1个回答

11
第一和第二个示例仅仅是为了保持简单,没有进行任何“真正”的数据访问。
是的,确实使用了连接 (connection.Query(...)),但这只是因为这是调用 Dapper 方法的唯一方式(因为它们扩展了 IDbConnection 接口)。
像这样的代码完全有效:
select 'foo', 1

它只是动态生成结果,而不实际从表中选择任何内容。

具有参数和匿名类型的示例:

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

仅展示了Dapper能够以匿名类型的形式提交SQL参数的能力。该查询并没有实际从表中选择任何内容,可能是为了保持简单。


谢谢你,Christian。我也可以假设,因为他们正在使用@符号,这是SQL Server的方言吗?在Oracle中,我应该用:替换@吗? - Stephen Patten
抱歉,我忽略了你使用Oracle的事实(我使用SQL Server,不了解Oracle)。是的,“@”表示SQL参数。由于Dapper本身完全独立于数据库(http://code.google.com/p/dapper-dot-net/#Will_dapper_work_with_my_db_provider),因此您将需要使用Oracle等效的“@”。 - Christian Specht
+1:好的信息...对于MySql,我应该用'?'替换'@',不是吗? - IAbstract
1
如果“?”在MySql中表示参数,那么是的。我也不是MySql大师;-) - Christian Specht
我知道这已经过时了,但由于正在讨论各种数据库,我想提出这个问题:在ProgressDB中,此查询不是有效的语法,将会失败。您不能在SELECT子句中执行赋值语句,但是,如果在FROM子句之后使用查询参数,它们仍将起作用(顺便提一下,在ProgressDB中也需要FROM子句)。 - akousmata
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接