最好的起点是从 github 存储库中查看 dapper 源代码并查看SqlBuilder代码。SqlBuilder类只有 200 行左右,您应该能够就它是否适合您的需要做出明智的选择。
另一种选择是构建您自己的。我个人就走这条路,因为它是有道理的。 如果您将类属性命名为与数据库相同的名称,或者添加诸如 displayName 之类的属性进行映射,则Dapper会将选择查询直接映射到类,您可以使用反射来获取属性名称。将名称和值放入字典中,您可以从那里相当容易地生成 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; }
}
Run Code Online (Sandbox Code Playgroud)
这是相当基本的。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;
}
Run Code Online (Sandbox Code Playgroud)
此方法查看其类的属性,如果它们不为 null 并且具有 displayname 属性,则会将它们添加到字典中,并将 displayname 值作为字符串组件。
该方法被设计为作为模型类的一部分工作,并且需要修改为从单独的帮助器类中工作。就我个人而言,我将它和所有其他 sql 生成方法都放在我所有模型继承的基类中。
一旦你在字典中获得了值,你就可以使用它根据你传入的模型动态生成 sql。你还可以使用它来填充你的 dapper DynamicParamaters 以与参数化 sql 一起使用。
我希望这有助于您走上解决问题的正确道路。
| 归档时间: |
|
| 查看次数: |
5260 次 |
| 最近记录: |