public static IDbSelectable[] ProcessSelection(IDbObject dbObj, IDbObjectFactory factory) { var dbList = dbObj as IDbList <DbKeyValue>; if (dbList != null) { var keyVals = dbList; return(keyVals.SelectMany(kv => ProcessSelection(kv, factory)).ToArray()); } var obj = dbObj as DbReference; if (obj != null) { var dbRef = obj; return(new IDbSelectable[] { factory.BuildRefColumn(dbRef, dbRef.RefColumnAlias) }); } var dbBinary = dbObj as IDbBinary; if (dbBinary != null && ( dbBinary.Operator == DbOperator.Equal || dbBinary.Operator == DbOperator.NotEqual || dbBinary.Operator == DbOperator.GreaterThan || dbBinary.Operator == DbOperator.GreaterThanOrEqual || dbBinary.Operator == DbOperator.LessThan || dbBinary.Operator == DbOperator.LessThanOrEqual || dbBinary.Operator == DbOperator.Is || dbBinary.Operator == DbOperator.IsNot)) { var dbTrue = factory.BuildConstant(true); var tuple = Tuple.Create <IDbBinary, IDbObject>(dbBinary, dbTrue); return(new IDbSelectable[] { factory.BuildCondition(new [] { tuple }, factory.BuildConstant(false)) }); } var keyValue = dbObj as DbKeyValue; if (keyValue == null) { return new[] { (IDbSelectable)dbObj } } ; var selectables = ProcessSelection(keyValue.Value, factory); foreach (var selectable in selectables) { selectable.Alias = keyValue.Key; } return(selectables); }
protected override Expression VisitConstant(ConstantExpression c) { var entityInfo = _infoProvider.FindEntityInfo(c.Type); if (entityInfo != null) { var dbTable = _dbFactory.BuildTable(entityInfo); var dbRef = _dbFactory.BuildRef(dbTable); var dbSelect = _dbFactory.BuildSelect(dbRef); dbRef.Alias = _nameGenerator.GenerateAlias(dbSelect, dbTable.TableName); _state.ResultStack.Push(dbSelect); } else if (!c.Type.IsAnonymouse()) { var dbConstant = _dbFactory.BuildConstant(c.Value, true); _state.ResultStack.Push(dbConstant); } return(c); }
public static IDbBinary ToBinary(this IDbObject dbElement, IDbObjectFactory dbFactory) { switch (dbElement) { case null: return(null); case IDbBinary dbBinary: return(dbBinary); } var one = dbFactory.BuildConstant(true); return(dbFactory.BuildBinary(dbElement, DbOperator.Equal, one)); }
public static IDbBinary ToBinary(this IDbObject dbElement, IDbObjectFactory dbFactory) { if (dbElement == null) { return(null); } var dbBinary = dbElement as IDbBinary; if (dbBinary != null) { return(dbBinary); } var one = dbFactory.BuildConstant(true); return(dbFactory.BuildBinary(dbElement, DbOperator.Equal, one)); }
public static IDbSelectable[] ProcessSelection(IDbObject dbObj, IDbObjectFactory factory) { switch (dbObj) { case IDbList <DbKeyValue> dbList: var keyVals = dbList; return(keyVals.SelectMany(kv => ProcessSelection(kv, factory)).ToArray()); case DbReference obj: var dbRef = obj; return(new IDbSelectable[] { factory.BuildRefColumn(dbRef, dbRef.RefColumnAlias) }); case IDbBinary dbBinary when( dbBinary.Operator == DbOperator.Equal || dbBinary.Operator == DbOperator.NotEqual || dbBinary.Operator == DbOperator.GreaterThan || dbBinary.Operator == DbOperator.GreaterThanOrEqual || dbBinary.Operator == DbOperator.LessThan || dbBinary.Operator == DbOperator.LessThanOrEqual || dbBinary.Operator == DbOperator.Is || dbBinary.Operator == DbOperator.IsNot): var dbTrue = factory.BuildConstant(true); var tuple = Tuple.Create <IDbBinary, IDbObject>(dbBinary, dbTrue); return(new IDbSelectable[] { factory.BuildCondition(new [] { tuple }, factory.BuildConstant(false)) }); } if (!(dbObj is DbKeyValue keyValue)) { return new[] { (IDbSelectable)dbObj } } ; var selectables = ProcessSelection(keyValue.Value, factory); foreach (var selectable in selectables) { selectable.Alias = keyValue.Key; } return(selectables); }