如何使用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.
我希望这能帮助您走上解决问题的正确道路。
我找不到任何可以遵循的文档或示例来使用 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.
我希望这能帮助您走上解决问题的正确道路。