/// <summary> /// 批量获取SystemRole实体对象 /// </summary> public static List <SystemRole> GetList(int top, Expression <Func <SystemRole, bool> > predicate = null, params SystemRoleColumn[] orderBy) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } var sql = new StringBuilder(); sql.Append("SELECT TOP " + top.ToString() + " * FROM [SystemRole]"); if (where_str != string.Empty) { sql.Append(" WHERE " + where_str); } if (orderBy != null && orderBy.Length > 0) { sql.Append(" ORDER BY " + string.Join(", ", orderBy.Select(p => $"{p.Name} {p.Asc}"))); } List <SystemRole> ret = null; using (var conn = GetOpenConnection()) { ret = conn.Query <SystemRole>(sql.ToString()).ToList(); } return(ret); }
public static bool MeetsCondition(PropertyCondition propCondition, IDictionary <string, object> entry) { var propertyName = propCondition.PropertyName.Dehumanize(); var condition = propCondition.Condition; var tryParse = PredicateParser <dynamic> .TryParse(condition); if (!tryParse) { Trace.WriteLine("Failed to Parse Condition on Property (" + propertyName + "): " + condition); return(false); } var propValue = entry[propertyName]; Trace.WriteLine("Evaluating Condition (" + condition + ") on Property (" + propertyName + ") with value: " + propValue); var expression = PredicateParser <dynamic> .Parse(condition); var predicate = expression.Compile(); var meetsCondition = predicate(entry); if (!meetsCondition) { Trace.WriteLine("Failed to Meet Condition on Property (" + propertyName + ") with value (" + propValue + "): " + condition); } return(meetsCondition); }
/// <summary> /// 获取记录总数 /// </summary> public static int GetCount(Expression <Func <SystemRole, bool> > predicate = null) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } var sql = new StringBuilder(); sql.Append("SELECT COUNT(1) FROM [SystemRole]"); if (where_str != string.Empty) { sql.Append(" WHERE " + where_str); } var ret = -1; using (var conn = GetOpenConnection()) { ret = conn.ExecuteScalar <int>(sql.ToString()); } return(ret); }
/// <summary> /// 删除指定的SystemRole数据记录 /// </summary> public static bool Delete(Expression <Func <SystemRole, bool> > predicate = null) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } var sql = new StringBuilder(); sql.Append("DELETE FROM [SystemRole]"); if (where_str != string.Empty) { sql.Append(" WHERE " + where_str); } var ret = false; using (var conn = GetOpenConnection()) { ret = conn.Execute(sql.ToString()) > 0; } return(ret); }
public static bool Evaluate <TSourceObj>(string expression, TSourceObj source) { var predicate = PredicateParser <TSourceObj> .Parse(expression); var compiledPredicate = predicate.Compile(); Trace.WriteLine("Expression: " + expression); Trace.WriteLine(predicate); return(compiledPredicate(source)); }
private void CallRecursive(PredicateGroup predicateGroup) { var nodes = predicateGroup.Predicates; bool isSet = true; ++level; foreach (var n in nodes) { if (n is PredicateGroup @group) { CallRecursive(@group); --level; } else { var expr = PredicateParser <T> .Parse((IFieldPredicate)n); if (level > 0) { if (isSet) { higherQuery = t => predicateGroup.Operator == GroupOperator.And; isSet = false; } higherQuery = predicateGroup.Operator == GroupOperator.And ? higherQuery.And(expr) : higherQuery.Or(expr); } else { previousOperator = predicateGroup.Operator; finalQuery = predicateGroup.Operator == GroupOperator.And ? finalQuery.And(expr) : finalQuery.Or(expr); } } } if (higherQuery != null) { finalQuery = previousOperator == GroupOperator.And ? finalQuery.And(higherQuery) : finalQuery.Or(higherQuery); } higherQuery = null; }
/// <summary> /// 获取指定的SystemRole实体对象 /// </summary> public static SystemRole GetModel(Expression <Func <SystemRole, bool> > predicate) { var parser = new PredicateParser(); var where_str = parser.Parse(predicate); var sql = new StringBuilder(); sql.Append("SELECT TOP 1 * FROM [SystemRole] "); sql.Append(" WHERE " + where_str); SystemRole ret = null; using (var conn = GetOpenConnection()) { ret = conn.QueryFirstOrDefault <SystemRole>(sql.ToString()); } return(ret); }
/// <summary> /// 是否存在指定的SystemRole实体对象 /// </summary> public static bool Exists(Expression <Func <SystemRole, bool> > predicate) { var parser = new PredicateParser(); var where_str = parser.Parse(predicate); var sql = new StringBuilder(); sql.Append("SELECT COUNT(1) FROM [SystemRole]"); sql.Append(" WHERE " + where_str); var ret = false; using (var conn = GetOpenConnection()) { ret = conn.ExecuteScalar <int>(sql.ToString()) > 0; } return(ret); }
public void Parse_CollectionOfCars_ThreeTypeOfCars() { //Arrange var testdata = Car.PrepareTestData(); var groupPredicate = new PredicateGroup { Operator = GroupOperator.Or, Predicates = new List <IPredicate>() }; var predicateGroup1 = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List <IPredicate>() { Predicates.Field <Car>(f => f.Name, Operator.Eq, "Fiat"), Predicates.Field <Car>(f => f.Model, Operator.Eq, "Bravo") } }; var predicateGroup2 = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List <IPredicate>() { Predicates.Field <Car>(f => f.Cost, Operator.Gt, 20000), Predicates.Field <Car>(f => f.Type, Operator.Eq, "Sedan"), } }; groupPredicate.Predicates.Add(Predicates.Field <Car>(f => f.Type, Operator.Eq, "Hatchback")); groupPredicate.Predicates.Add(predicateGroup1); groupPredicate.Predicates.Add(predicateGroup2); //Act var expression = PredicateParser <Car> .Parse(groupPredicate).Compile(); var result = testdata.Where(expression); //Assert Assert.AreEqual(3, result.Count()); }
/// <summary> /// 分页获取数据列表 /// </summary> public static PageDataView <SystemRole> GetPage( Expression <Func <SystemRole, bool> > predicate, int pageSize, int currentPage, IList <SystemRoleColumn> orderBy, params SystemRoleColumn[] columns) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } var orderby_str = string.Empty; if (orderBy != null && orderBy.Count > 0) { orderby_str = string.Join(", ", orderBy.Select(p => $"[{p.Name}] {p.Asc}")); } var column_str = "*"; if (columns != null && columns.Length > 0) { column_str = string.Join(", ", columns.Select(p => $"[{p.Name}]")); } return(Paged <SystemRole>( "[SystemRole]", where_str, orderby_str, column_str, pageSize, currentPage)); }
/// <summary> /// 分页获取数据列表 /// </summary> public static PageDataView <RoleAuthMapping> GetPage( Expression <Func <RoleAuthMapping, bool> > predicate = null, int pageSize = 20, int currentPage = 1, RoleAuthMappingColumn orderBy = null, params RoleAuthMappingColumn[] columns) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } var orderby_str = string.Empty; if (orderBy != null) { orderby_str = $"[{orderBy.Name}] {orderBy.Asc}"; } var column_str = "*"; if (columns != null && columns.Length > 0) { column_str = string.Join(", ", columns.Select(p => $"[{p.Name}]")); } return(Paged <RoleAuthMapping>( "[RoleAuthMapping]", where_str, orderby_str, column_str, pageSize, currentPage)); }
/// <summary> /// 更新SystemRole数据记录 /// </summary> /// <param name="model">SystemRole实体对象</param> /// <param name="fields">需要更新的字段名字</param> /// <param name="reverse">反转给定的更新字段</param> /// <returns>是否成功,true为成功</returns> public static bool Update(SystemRole model, Expression <Func <SystemRole, bool> > predicate, bool reverse, SqlConnection conn, SqlTransaction transaction, params SystemRoleColumn[] fields) { var where_str = string.Empty; if (predicate != null) { var parser = new PredicateParser(); where_str = parser.Parse(predicate); } else { where_str = "[Id] = @Id"; } var sql = new StringBuilder(); sql.Append("UPDATE [SystemRole]"); if (fields == null || fields.Length == 0) { sql.Append(" SET [Name] = @Name, [Remark] = @Remark, [CreatedTime] = @CreatedTime"); } else { if (reverse == true) { fields = (SystemRoleColumn[])Columns.All.Except(fields); } sql.Append(" SET "); for (int i = 0; i < fields.Length; i++) { if (fields[i].IsAddEqual) { sql.Append("[" + fields[i].Name + "] += @" + fields[i].Name + ""); fields[i].SetAddEqual(); } else { sql.Append("[" + fields[i].Name + "] = @" + fields[i].Name + ""); } if (i != fields.Length - 1) { sql.Append(","); } } } sql.Append(" WHERE " + where_str); var ret = false; if (conn != null) { if (transaction == null) { throw new ArgumentNullException("transaction"); } ret = conn.Execute(sql.ToString(), model, transaction) > 0; } else { using (var conn1 = GetOpenConnection()) { ret = conn1.Execute(sql.ToString(), model) > 0; } } return(ret); }
/// <summary> /// 条件を表す式からSQLを生成します /// </summary> /// <typeparam name="T">テーブルの型</typeparam> /// <param name="targetDatabase">対象となるデータベース</param> /// <param name="predicate">条件式</param> /// <returns>条件SQL</returns> public static This From <T>(DbKind targetDatabase, Expression <Func <T, bool> > predicate) { //--- 解析実行 var root = PredicateParser.Parse(predicate); //--- SQL文 / パラメーター生成の定義 uint index = 0; var columnMap = TableMappingInfo.Create <T>().Columns.ToDictionary(x => x.PropertyName); var prefix = targetDatabase.GetBindParameterPrefix(); var parameterCount = root.DescendantsAndSelf().Count(x => { return(x.Operator != PredicateOperator.AndAlso && x.Operator != PredicateOperator.OrElse && x.Value != null); }); var digit = (parameterCount - 1).ToString().Length; var digitFormat = $"D{digit}"; IDictionary <string, object> parameter = new ExpandoObject(); Func <PredicateElement, string> sqlBuilder = null; sqlBuilder = element => { if (element.HasChildren) { var left = sqlBuilder(element.Left); var right = sqlBuilder(element.Right); if (element.Operator != element.Left.Operator && element.Left.HasChildren) { left = $"({left})"; } if (element.Operator != element.Right.Operator && element.Right.HasChildren) { right = $"({right})"; } if (element.Operator == PredicateOperator.AndAlso) { return($"{left} and {right}"); } if (element.Operator == PredicateOperator.OrElse) { return($"{left} or {right}"); } throw new InvalidOperationException(); } else { var builder = new StringBuilder(); builder.Append(columnMap[element.PropertyName].ColumnName); switch (element.Operator) { case PredicateOperator.Equal: if (element.Value == null) { builder.Append(" is null"); return(builder.ToString()); } builder.Append(" = "); break; case PredicateOperator.NotEqual: if (element.Value == null) { builder.Append(" is not null"); return(builder.ToString()); } builder.Append(" <> "); break; case PredicateOperator.LessThan: builder.Append(" < "); break; case PredicateOperator.LessThanOrEqual: builder.Append(" <= "); break; case PredicateOperator.GreaterThan: builder.Append(" > "); break; case PredicateOperator.GreaterThanOrEqual: builder.Append(" >= "); break; case PredicateOperator.Contains: builder.Append(" in "); break; default: throw new InvalidOperationException(); } var parameterName = $"p{index.ToString(digitFormat)}"; ++index; parameter.Add(parameterName, element.Value); //--- cache parameter builder.Append($"{prefix}{parameterName}"); return(builder.ToString()); } }; //--- 組み立て return(new This(sqlBuilder(root), parameter as ExpandoObject)); }