public static IEnumerable <ColumnInfo> ColumsOfType(DbClassInfoCache dbClassInfoCache, QueryIdentifier alias, QueryIdentifier sourceReference, IQueryContainer container) { return(DbAccessLayer.GetSelectableColumnsOf(dbClassInfoCache) .Select(e => { switch (container.AccessLayer.DbAccessType) { case DbAccessType.MsSql: case DbAccessType.MySql: return new ColumnInfo(e, alias, container); case DbAccessType.Experimental: case DbAccessType.Unknown: case DbAccessType.OleDb: case DbAccessType.Obdc: case DbAccessType.SqLite: return new ColumnInfo(e, sourceReference, null); default: throw new ArgumentOutOfRangeException(); } }).ToArray()); }
public SelectTableQueryPart(string source, DbClassInfoCache tableInfo, QueryIdentifier alias, IQueryContainer queryContainer) { _source = source; _tableInfo = tableInfo; Alias = alias; _columns = new List <ColumnInfo>(); _joins = new List <JoinParseInfo>(); _columns = DbAccessLayer.GetSelectableColumnsOf(_tableInfo) .Select(e => new ColumnInfo(e, Alias, queryContainer)) .ToList(); }
public static IEnumerable <ColumnInfo> ColumsOfType(DbClassInfoCache dbClassInfoCache, QueryIdentifier alias, QueryIdentifier sourceReference, IQueryContainer container) { return(DbAccessLayer.GetSelectableColumnsOf(dbClassInfoCache) .Select(e => { if (container.AccessLayer.DbAccessType.HasFlag(DbAccessType.MsSql) || container.AccessLayer.DbAccessType.HasFlag(DbAccessType.MySql)) { return new ColumnInfo(e, alias, container); } else { return new ColumnInfo(e, sourceReference, null); } }).ToArray()); }
internal static SelectQuery <TPoco> JoinOn( IQueryBuilder builder, KeyValuePair <DbClassInfoCache, DbPropertyInfoCache>[] path, JoinMode joinAs = null, Func <ConditionalEvalQuery <TPoco>, ConditionalEvalQuery <TPoco> > joinCondition = null) { joinAs = joinAs ?? JoinMode.Default; IQueryBuilder target = builder; var targetAlias = target.ContainerObject .SearchLast <ISelectableQueryPart>(e => !(e is JoinTableQueryPart)) .Alias; var parentJoinPart = builder.ContainerObject.Joins; foreach (var keyValuePair in path) { var targetTable = target.ContainerObject.Search(targetAlias); var pathOfJoin = target.ContainerObject.GetPathOf(targetAlias) + "." + keyValuePair.Value.PropertyName; var parentAlias = target.ContainerObject .CreateTableAlias(pathOfJoin); var joinExists = parentJoinPart.FirstOrDefault(e => e.Alias.Equals(parentAlias)); if (joinExists != null) { parentJoinPart = joinExists.DependingJoins; targetAlias = parentAlias; continue; } Type referenceType; if (keyValuePair.Value.CheckForListInterface()) { referenceType = keyValuePair.Value.PropertyType.GetElementType(); if (referenceType == null) { referenceType = keyValuePair.Value.PropertyType.GetGenericArguments().FirstOrDefault(); } } else { referenceType = keyValuePair.Value.PropertyType; } var referencedTypeCache = target.ContainerObject.AccessLayer.GetClassInfo(referenceType); var targetAliasOfJoin = new QueryIdentifier { QueryIdType = QueryIdentifier.QueryIdTypes.Table, Value = referencedTypeCache.TableName }; ColumnInfo onSourceTableKey; ColumnInfo selfPrimaryKey; var referenceColumn = keyValuePair.Value.ForginKeyAttribute?.Attribute; if (referenceColumn == null) { throw new InvalidOperationException("There is no known reference from table " + $"'{keyValuePair.Key.Type}' " + "to table " + $"'{referenceType}'." + "Use a ForeignKeyDeclarationAttribute to connect both"); } var forginColumns = DbAccessLayer.GetSelectableColumnsOf(referencedTypeCache) .Select(e => new ColumnInfo(e, parentAlias, target.ContainerObject)) .ToList(); selfPrimaryKey = targetTable.Columns.FirstOrDefault(e => e.IsEquivalentTo(referenceColumn.ForeignKey)); onSourceTableKey = forginColumns.FirstOrDefault(e => e.IsEquivalentTo(referenceColumn.ReferenceKey)); var joinTableQueryPart = new JoinTableQueryPart( targetAliasOfJoin, targetAlias, parentAlias, keyValuePair.Key.Type, onSourceTableKey, selfPrimaryKey, forginColumns, keyValuePair.Value, joinAs); parentJoinPart.Add(joinTableQueryPart.JoinParseInfo); parentJoinPart = joinTableQueryPart.JoinParseInfo.DependingJoins; target.ContainerObject.SearchLast <ISelectQueryPart>().AddJoin(joinTableQueryPart); target = target.Add(joinTableQueryPart); targetAlias = parentAlias; } if (joinCondition != null) { var lastJoin = target.ContainerObject.SearchLast <JoinTableQueryPart>(); var condition = new ConditionStatementQueryPart(); var tempSelect = new ConditionalEvalQuery <TPoco>(target.Add(condition)); joinCondition(tempSelect); lastJoin.Condition = condition; } return(new SelectQuery <TPoco>(target)); }