如何使用Dapper的SqlBuilder?

How to use Dapper's SqlBuilder?

我找不到任何可以遵循的文档或示例来使用 SqlBuilder class。

我需要动态生成 sql 查询,我发现了这个 class。这是最好的选择吗?

最好的起点是从其 github 存储库中检出 dapper 源代码并查看 SqlBuilder code. The SqlBuilder class 只有 200 行左右,你应该能够就它是否适合您的需要做出明智的选择。

另一种选择是构建您自己的。我个人走这条路是有道理的。 Dapper 将 select 查询直接映射到 class 如果您将 class 属性命名为与您的数据库相同的名称,或者添加一个属性(例如 displayName)来映射,您可以使用反射来获取 属性 个名称。将名称和值放入字典中,您可以从那里很容易地生成 sql。

这里有一些可以帮助您入门的内容:

首先是一个示例 class,您可以将其传递给 sql构建器。

public class Foo
{

    public Foo()
    {
       TableName = "Foo";
    }
    public string TableName { get; set; }

    [DisplayName("name")]
    public string Name { get; set; }

    [SearchField("fooId")]
    public int Id { get; set; }

}

这是相当基础的。 DisplayName 属性背后的想法是您可以将要包含在自动生成中的属性分开。在这种情况下,TableName 没有 DisplayName 属性,因此不会被下一个 class 选择。但是您可以在生成 sql 时手动使用它来获取您的 table 名称。

public Dictionary<string, object> GetPropertyDictionary()
    {
        var propDictionary = new Dictionary<string, object>();

        var passedType = this.GetType();

        foreach (var propertyInfo in passedType.GetProperties())
        {
            var isDef = Attribute.IsDefined(propertyInfo, typeof(DisplayNameAttribute));

            if (isDef)
            {
                var value = propertyInfo.GetValue(this, null);

                if (value != null)
                {
                    var displayNameAttribute =
                        (DisplayNameAttribute)
                            Attribute.GetCustomAttribute(propertyInfo, typeof(DisplayNameAttribute));
                    var displayName = displayNameAttribute.DisplayName;
                    propDictionary.Add(displayName, value);
                }
            }
        }

        return propDictionary;
    }

此方法查看其 class 的属性,如果它们不为 null 且具有 displayname 属性,则会将它们添加到字典中,并将 displayname 值作为字符串组件。

此方法旨在作为模型 class 的一部分工作,需要修改才能从单独的助手 class 中工作。就我个人而言,我的所有模型都继承自 Base class 中的所有其他 sql 生成方法。

一旦你在字典中有了值,你就可以使用它根据你传入的模型动态生成 sql。你也可以使用它来填充你的 dapper DynamicParamaters 以与参数化 sql.

我希望这能帮助您走上解决问题的正确道路。