目录
介绍
一些基本的扩展方法
结论
介绍一位同事最近向我介绍了SqlKata,我发现它对使用Dapper(SqlKata在幕后使用)很有用,因为我可以编写流畅的类似Linq的语法,而不是硬编码SQL语句。
不幸的是,正如示例所示,这一切都使用硬编码字符串:
var query = db.Query("Books").OrderByDesc("PublishingDate");
不适合我!
一些基本的扩展方法这个提示和技巧为您提供了一种扩展方法的风格,您可以编写这些扩展方法来避免使用显式通用参数对字符串进行硬编码。例如,我在另一篇文章中使用了这个查询:
var query = db.Query()
.Join()
.Join()
.JoinChild()
.Where(nameof(Entity.TableName), entityName)
.Where(nameof(UserRole.UserId), userId);
而不是:
var query = db.Query("Role")
.Join("UserRole", "Role.Id", "UserRole.RoleId")
.Join("EntityRole", "Role.Id", "EntityRole.RoleId")
.Join("Entity", "Entity.Id", "EntityRole.EntityId")
.Where("Entity.TableName", entityName)
.Where("UserRole.UserId", userId);
这需要四种扩展方法:
public static class SqlKataExtensionMethods
{
public static Query Query(this QueryFactory qf)
{
return qf.Query(typeof(T).Name);
}
public static Query Join(this Query q)
{
var rname = typeof(R).Name;
var tname = typeof(T).Name;
return q.Join($"{tname}", $"{rname}.Id", $"{tname}.{rname}Id");
}
public static Query JoinChild(this Query q)
{
var rname = typeof(R).Name;
var tname = typeof(T).Name;
return q.Join($"{tname}", $"{tname}.Id", $"{rname}.{tname}Id");
}
public static Query Where(this Query q, string field, object val)
{
return q.Where($"{typeof(T).Name}.{field}", val);
}
}
当然,这个例子需要一些最小的模型实现:
public class Role { }
public class UserRole
{
public int UserId { get; set; }
}
public class EntityRole { }
public class Entity
{
public string TableName { get; set; }
}
这就是它的全部。您可能从未听说过SqlKata,直到几周前我也没有听说过,使用它很好,但我不喜欢必须使用字符串常量。如果你正在使用SqlKata并且喜欢这个概念,我相信你可以为SqlKata可以用于的其他功能添加更多的扩展方法。
https://www.codeproject.com/Tips/5324636/Some-Extension-Methods-for-SqlKata-to-Avoid-Using