5

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

我需要动态生成sql查询,我找到了这个类。这会是最好的选择吗?

4

1 回答 1

5

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

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

这里有一些让你开始的东西:

首先是一个示例类,您可以将其传递给您的 sqlbuilder。

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 属性,因此不会被下一个类拾取。但是,您可以在生成 sql 时手动使用它来获取表名。

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

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

此方法设计为作为模型类的一部分工作,需要修改以从单独的帮助程序类中工作。就我个人而言,我在我的所有模型都继承的 Base 类中拥有它和所有其他 sql 生成方法。

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

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

于 2015-09-26T00:00:29.593 回答