【问题标题】:How to use SqlBuilder如何使用 SqlBuilder
【发布时间】:2013-10-01 07:38:33
【问题描述】:

这个 SqlBuilder:

var builder = new SqlBuilder(); 
var sql = builder.AddTemplate( /*...

非常愚蠢的问题,但是,我该如何使用它?我知道它在Dapper.Contrib 中,但using 声明还不够。我需要添加哪些引用或其他using 语句?

【问题讨论】:

  • 另一种方法是使用流畅的查询生成器

标签: c# dapper sqlbuilder


【解决方案1】:

有一个名为 DapperQueryBuilder 的库,它是 Dapper SqlBuilder 的替代品,上面问题中的类似代码如下所示:

// using DapperQueryBuilder; ...

int myParam = 3;
var builder = cn.QueryBuilder();

builder.Select($"id_something");
builder.Select($"MyCol");
builder.Select($"OtherCol");
builder.From($"MyTable");
builder.From($"inner join OtherTable on OtherTable.id=MyTable.id");
builder.Where($"id_something < {myParam}");

var result = builder.Query<MyClass>();

如果唯一的动态部分是过滤器,甚至更短:


var builder = cn.QueryBuilder($@""
    SELECT id_something, MyCol, OtherCol
    FROM MyTable
    inner join OtherTable on OtherTable.id=MyTable.id
    /**where**/
");

int myParam = 3;
builder.Where($"id_something < {myParam}");

var result = builder.Query<MyClass>();

尽管看起来我们使用的是不安全的插值字符串,但事实并非如此 - 输出是完全参数化的 SQL (WHERE id_something &lt; @p0) - 您不必手动管理参数字典 就像使用 SqlBuilder 一样。

免责声明:我是这个库的作者

【讨论】:

    【解决方案2】:

    到目前为止,SqlBuilder 还没有在 Nuget 上制作任何官方包。我使用以下包安装了它:Dapper.SqlBuilder。我真的希望它成为官方图书馆的一部分。

    无论如何,对于您的问题,一旦安装了包,您就不需要添加任何新的“使用”子句,因为 SqlBuilder 位于同一个 Dapper 命名空间内。

    您可以在此处查看源代码详细信息:https://github.com/StackExchange/dapper-dot-net/blob/master/Dapper.SqlBuilder/SqlBuilder.cs

    编辑: 可以在以下位置找到该软件包:https://www.nuget.org/packages/Dapper.SqlBuilder/

    【讨论】:

    • 评论已过时
    【解决方案3】:

    这个问题出现在 dapper 教程页面中,所以我正在更新答案。

    在 1.6 版中,SqlBuilder 位于命名空间 Dapper 中。并且它包含在 nuget 包 Dapper.SqlBuilder 中。

    这是一个如何工作的例子:

    var builder = new SqlBuilder();
    builder.Select("id_something");
    builder.Select("MyCol");
    builder.Select("OtherCol");
    DynamicParameters parameters = new DynamicParameters();
    parameters.Add("@MyParam", 3, DbType.Int32, ParameterDirection.Input);
    builder.Where("id_something < @MyParam", parameters);
    // builder.Where("id_something < @MyParam", new { MyParam =3}); //this is other option for params.
    builder.InnerJoin("OtherTable on OtherTable.id=MyTable.id");
    //The /**something**/ are placeholders,
    var builderTemplate = builder.AddTemplate("Select /**select**/ from MyTable /**innerjoin**/ /**where**/ ");
    var result = connection.Query<MyClass>(builderTemplate.RawSql, builderTemplate.Parameters);
    

    这是生成的Sql:

    Select id_something , MyCol , OtherCol
     from MyTable 
    INNER JOIN OtherTable on OtherTable.id=MyTable.id
     WHERE id_something < @MyParam
    

    【讨论】:

    • 您指的是哪个 Dapper 教程页面?我想读。
    • Dapper 有一个链接到 stackoverflow 问题的教程页面。不是真正的教程。我找不到了,可能改了,现在有这个链接dapper-tutorial.net/knowledge-base/tag/sqlbuilder
    • @CarlosCuevas 那不是 Dapper 的教程页面。那是有人试图劫持库名称,与 Dapper 本身完全没有关系。事实上,该站点中的 bad 示例一直让 Dapper 维护者头疼。
    【解决方案4】:

    我确实通过创建一个名为 SqlBuilder.cs 的新类文件并从 THIS 链接复制内容来解决这个问题

    【讨论】:

    • 答案已过时
    【解决方案5】:

    不知道是不是没人知道,还是回答太傻了,但这是正确的说法:

    using StackExchange.Profiling.Helpers.Dapper;

    【讨论】:

    • 您曾经拥有哪个命名空间的 nuget 项目?我正在使用 Dapper 和 dapper.contrib。该命名空间不可用。
    • 答案已过时
    • 这个答案不正确。我修正了我原来的答案,因为我发布它已经 5 年了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多