如何使用Dapper的SqlBuilder?

时间:2015-09-24 03:23:31

标签: dapper sqlbuilder

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

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

1 个答案:

答案 0 :(得分:3)

最好的起点是从github repo中查看dapper源代码并查看SqlBuilder代码。 SqlBuilder课程只有200行左右,您应该能够根据自己的需要做出明智的选择。

另一种选择是建立自己的。我个人沿着这条路走下去是有意义的。 Dapper如果您将类属性命名为与数据库相同,或者将某个属性(如displayName)添加到地图中,则可以使用反射来获取属性名称,从而将查询直接映射到类。将名称和值放入字典中,您可以从那里轻松地创建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以便与paramiterized sql一起使用。

我希望这有助于您找到解决问题的正确途径。