private string DiscriminatorFilterFragment(string alias) { if (NeedsDiscriminator) { InFragment frag = new InFragment(); if (IsDiscriminatorFormula) { frag.SetFormula(alias, DiscriminatorFormulaTemplate); } else { frag.SetColumn(alias, DiscriminatorColumnName); } string[] subclasses = SubclassClosure; for (int i = 0; i < subclasses.Length; i++) { IQueryable queryable = (IQueryable)Factory.GetEntityPersister(subclasses[i]); if (!queryable.IsAbstract) { frag.AddValue(queryable.DiscriminatorSQLValue); } } StringBuilder buf = new StringBuilder(50).Append(" and ").Append(frag.ToFragmentString().ToString()); return(buf.ToString()); } else { return(string.Empty); } }
private SqlString DiscriminatorWhereCondition(string alias) { InFragment frag = new InFragment() .SetColumn(alias, DiscriminatorColumnName); System.Type[] subclasses = SubclassClosure; for (int i = 0; i < subclasses.Length; i++) { frag.AddValue( (( IQueryable )factory.GetPersister(subclasses[i])).DiscriminatorSQLValue ); } return(frag.ToFragmentString()); }
/// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> protected SqlStringBuilder WhereString(string alias, string[] columnNames, int batchSize) { if (columnNames.Length == 1) { // if not a composite key, use "foo in (?, ?, ?)" for batching // if no batch, and not a composite key, use "foo = ?" string tableAlias = GenerateAliasForColumn(alias, columnNames[0]); InFragment inf = new InFragment().SetColumn(tableAlias, columnNames[0]); for (int i = 0; i < batchSize; i++) { inf.AddValue(Parameter.Placeholder); } return(new SqlStringBuilder(inf.ToFragmentString())); } else { var fragments = new ConditionalFragment[batchSize]; for (int i = 0; i < batchSize; i++) { fragments[i] = new ConditionalFragment() .SetTableAlias(alias) .SetCondition(columnNames, Parameter.GenerateParameters(columnNames.Length)); } var whereString = new SqlStringBuilder(); if (fragments.Length == 1) { // if no batch, use "foo = ? and bar = ?" whereString.Add(fragments[0].ToSqlStringFragment()); } else { // if batching, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )" var df = new DisjunctionFragment(fragments); whereString.Add(StringHelper.OpenParen); whereString.Add(df.ToFragmentString()); whereString.Add(StringHelper.ClosedParen); } return(whereString); } }
/// <summary> /// Render the where condition for a (batch) load by identifier / collection key /// </summary> protected SqlStringBuilder WhereString(string alias, string[] columnNames, int batchSize) { if (columnNames.Length == 1) { // if not a composite key, use "foo in (?, ?, ?)" for batching // if no batch, and not a composite key, use "foo = ?" string tableAlias = GenerateAliasForColumn(alias, columnNames[0]); InFragment inf = new InFragment().SetColumn(tableAlias, columnNames[0]); for (int i = 0; i < batchSize; i++) { inf.AddValue(Parameter.Placeholder); } return(new SqlStringBuilder(inf.ToFragmentString())); } else { Parameter[] columnParameters = Parameter.GenerateParameters(columnNames.Length); ConditionalFragment byId = new ConditionalFragment() .SetTableAlias(alias) .SetCondition(columnNames, columnParameters); SqlStringBuilder whereString = new SqlStringBuilder(); if (batchSize == 1) { // if no batch, use "foo = ? and bar = ?" whereString.Add(byId.ToSqlStringFragment()); } else { // if a composite key, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )" for batching whereString.Add(StringHelper.OpenParen); // TODO: unnecessary for databases with ANSI-style joins DisjunctionFragment df = new DisjunctionFragment(); for (int i = 0; i < batchSize; i++) { df.AddCondition(byId); } whereString.Add(df.ToFragmentString()); whereString.Add(StringHelper.ClosedParen); // TODO: unnecessary for databases with ANSI-style joins } return(whereString); } }
private string DiscriminatorFilterFragment(string alias) { const string abstractClassWithNoSubclassExceptionMessageTemplate = @"The class {0} can't be instatiated and does not have mapped subclasses; possible solutions: - don't map the abstract class - map the its subclasses."; if (NeedsDiscriminator) { InFragment frag = new InFragment(); if (IsDiscriminatorFormula) { frag.SetFormula(alias, DiscriminatorFormulaTemplate); } else { frag.SetColumn(alias, DiscriminatorColumnName); } string[] subclasses = SubclassClosure; int validValuesForInFragment = 0; foreach (string t in subclasses) { var queryable = (IQueryable)Factory.GetEntityPersister(t); if (!queryable.IsAbstract) { frag.AddValue(queryable.DiscriminatorSQLValue); validValuesForInFragment++; } } if (validValuesForInFragment == 0) { throw new NotSupportedException(string.Format(abstractClassWithNoSubclassExceptionMessageTemplate, subclasses[0])); } StringBuilder buf = new StringBuilder(50).Append(" and ").Append(frag.ToFragmentString().ToString()); return(buf.ToString()); } else { return(string.Empty); } }