SqlKata避免使用硬编码字符串的一些扩展方法

目录

介绍

一些基本的扩展方法

结论


介绍

一位同事最近向我介绍了SqlKata,我发现它对使用DapperSqlKata在幕后使用)很有用,因为我可以编写流畅的类似Linq的语法,而不是硬编码SQL语句。

不幸的是,正如示例所示,这一切都使用硬编码字符串:

var query = db.Query("Books").OrderByDesc("PublishingDate");

不适合我!

一些基本的扩展方法

这个提示和技巧为您提供了一种扩展方法的风格,您可以编写这些扩展方法来避免使用显式通用参数对字符串进行硬编码。例如,我在另一篇文章中使用了这个查询:

var query = db.Query<Role>()
  .Join<Role, UserRole>()
  .Join<Role, EntityRole>()
  .JoinChild<EntityRole, Entity>()
  .Where<Entity>(nameof(Entity.TableName), entityName)
  .Where<UserRole>(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<T>(this QueryFactory qf)
    {
        return qf.Query(typeof(T).Name);
    }

    public static Query Join<R, T>(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<R, T>(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<T>(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值