1. 程式人生 > 實用技巧 >搜尋條件對映成Sql語句寫法

搜尋條件對映成Sql語句寫法

搜尋條件對映成Sql語句有2種寫法,第一種是把輸入條件引數轉成Expression表示式樹,適合簡單的Sql查詢,第二種是拼接原生Sql,適合複雜的Sql查詢。

1 ) 第一種轉成Expression表示式樹寫法

      private Expression<Func<PositionEntity, bool>> ListFilter(PositionListParam param)
      {
          var expression = LinqExtensions.True<PositionEntity>();
          if
(param != null) { if (!string.IsNullOrEmpty(param.PositionName)) { expression = expression.And(t => t.PositionName.Contains(param.PositionName)); } if (!string.IsNullOrEmpty(param.PositionIds)) {
long[] positionIdArr = CommonHelper.SplitToArray<long>(param.PositionIds, ','); expression = expression.And(t => positionIdArr.Contains(t.Id.Value)); } } return expression; }

呼叫方法如下:

   public async Task<List<PositionEntity>> GetPageList(PositionListParam param, Pagination pagination)
      {
          
var expression = ListFilter(param); var list = await this.BaseRepository().FindList(expression, pagination); return list.ToList(); }

2 ) 第二種拼接原生Sql寫法

 private List<DbParameter> ListFilter(LogApiListParam param, StringBuilder strSql)
      {
          strSql.Append(@"SELECT  a.id as Id,
                                  a.base_modify_time as BaseModifyTime,
                                  a.base_modifier_id as BaseModifierId,
                                  a.log_status as LogStatus,
                          FROM    sys_log_api a
                                  LEFT JOIN sys_user b ON a.base_modifier_id = b.id
                                  LEFT JOIN sys_department c ON b.department_id = c.id
                          WHERE   1 = 1");
          var parameter = new List<DbParameter>();
          if (param != null)
          {
              if (!string.IsNullOrEmpty(param.UserName))
              {
                  strSql.Append(" AND b.user_name like @UserName");
                  parameter.Add(DbParameterExtension.CreateDbParameter("@UserName", '%' + param.UserName + '%'));
              }          
          }
          return parameter;
      }

呼叫方法如下:

   public async Task<List<LogApiEntity>> GetPageList(LogApiListParam param, Pagination pagination)
      {
          var strSql = new StringBuilder();
          List<DbParameter> filter = ListFilter(param, strSql);
          var list = await this.BaseRepository().FindList<LogApiEntity>(strSql.ToString(), filter.ToArray(), pagination);
          return list.ToList();
      }