首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Dapper的SqlBuilder?

如何使用Dapper的SqlBuilder?
EN

Stack Overflow用户
提问于 2015-09-24 03:23:30
回答 1查看 5.8K关注 0票数 5

我找不到使用SqlBuilder类所能遵循的任何文档或示例。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-26 00:00:29

最好的起点是签出github中的dapper源代码,并查看SqlBuilder代码。SqlBuilder类只有200行左右,您应该能够对它是否适合您的需求做出明智的选择。

另一种选择是建立你自己的。我亲自走了这条路,因为这是有道理的。如果您将类属性命名为与数据库相同的类属性,或者添加要映射的属性(如displayName ),则可以使用反射获取属性名称。将名称和值放入字典中,您就可以很容易地生成sql。

以下是一些可以让你开始的事情:

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

代码语言:javascript
复制
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以获取表名时,可以手动使用它。

代码语言:javascript
复制
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值作为字符串组件。

此方法被设计为作为模型类的一部分工作,并且需要从一个单独的助手类中进行修改。就我个人而言,它和我的所有其他sql生成方法都在我的所有模型继承的基类中。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32752792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档