搜尋條件對映成Sql語句寫法
阿新 • • 發佈:2020-12-03
搜尋條件對映成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(); }