gpt4 book ai didi

dapper - 如何使用 Dapper 的 SqlBuilder?

转载 作者:行者123 更新时间:2023-12-03 16:43:31 24 4
gpt4 key购买 nike

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

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

最佳答案

最好的起点是从其 github 存储库中 check out dapper 源代码并查看 SqlBuilder代码。 SqlBuilder class 只有 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 以与参数化 sql 一起使用。

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

关于dapper - 如何使用 Dapper 的 SqlBuilder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com