我找不到任何可以使用SqlBuilder类的文档或示例。
我需要动态生成sql查询,我找到了这个类。这会是最好的选择吗?
答案 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一起使用。
我希望这有助于您找到解决问题的正确途径。