Skip to content

Commit abed562

Browse files
Specify to TypeValue whether the value is a list or not
1 parent f122d0a commit abed562

File tree

10 files changed

+35
-25
lines changed

10 files changed

+35
-25
lines changed

src/NHibernate/Async/Collection/AbstractPersistentCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,15 @@ protected virtual async Task<ICollection> GetOrphansAsync(ICollection oldElement
193193
if (current != null && await (ForeignKeys.IsNotTransientSlowAsync(entityName, current, session, cancellationToken)).ConfigureAwait(false))
194194
{
195195
object currentId = await (ForeignKeys.GetEntityIdentifierIfNotUnsavedAsync(entityName, current, session, cancellationToken)).ConfigureAwait(false);
196-
currentIds.Add(new TypedValue(idType, currentId));
196+
currentIds.Add(new TypedValue(idType, currentId, false));
197197
}
198198
}
199199

200200
// iterate over the *old* list
201201
foreach (object old in oldElements)
202202
{
203203
object oldId = await (ForeignKeys.GetEntityIdentifierIfNotUnsavedAsync(entityName, old, session, cancellationToken)).ConfigureAwait(false);
204-
if (!currentIds.Contains(new TypedValue(idType, oldId)))
204+
if (!currentIds.Contains(new TypedValue(idType, oldId, false)))
205205
{
206206
res.Add(old);
207207
}

src/NHibernate/Async/Loader/Collection/CollectionLoader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ public virtual Task InitializeAsync(object id, ISessionImplementor session, Canc
3232
return LoadCollectionAsync(session, id, KeyType, cancellationToken);
3333
}
3434
}
35-
}
35+
}

src/NHibernate/Collection/AbstractPersistentCollection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,15 +720,15 @@ protected virtual ICollection GetOrphans(ICollection oldElements, ICollection cu
720720
if (current != null && ForeignKeys.IsNotTransientSlow(entityName, current, session))
721721
{
722722
object currentId = ForeignKeys.GetEntityIdentifierIfNotUnsaved(entityName, current, session);
723-
currentIds.Add(new TypedValue(idType, currentId));
723+
currentIds.Add(new TypedValue(idType, currentId, false));
724724
}
725725
}
726726

727727
// iterate over the *old* list
728728
foreach (object old in oldElements)
729729
{
730730
object oldId = ForeignKeys.GetEntityIdentifierIfNotUnsaved(entityName, old, session);
731-
if (!currentIds.Contains(new TypedValue(idType, oldId)))
731+
if (!currentIds.Contains(new TypedValue(idType, oldId, false)))
732732
{
733733
res.Add(old);
734734
}

src/NHibernate/Criterion/InExpression.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,15 @@ private List<TypedValue> GetParameterTypedValues(ICriteria criteria, ICriteriaQu
135135
object subval = _values[j] == null
136136
? null
137137
: actype.GetPropertyValues(_values[j])[i];
138-
list.Add(new TypedValue(types[i], subval));
138+
list.Add(new TypedValue(types[i], subval, false));
139139
}
140140
}
141141

142142
return list;
143143
}
144144
else
145145
{
146-
return _values.Select(v => new TypedValue(type, v)).ToList();
146+
return _values.Select(v => new TypedValue(type, v, false)).ToList();
147147
}
148148
}
149149

src/NHibernate/Criterion/LikeExpression.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public LikeExpression(string propertyName, string value, char? escapeChar, bool
2727
{
2828
this.projection = Projections.Property(propertyName);
2929
this.value = value;
30-
typedValue = new TypedValue(NHibernateUtil.String, this.value);
30+
typedValue = new TypedValue(NHibernateUtil.String, this.value, false);
3131

3232
this.escapeChar = escapeChar;
3333
this.ignoreCase = ignoreCase;
@@ -37,7 +37,7 @@ public LikeExpression(IProjection projection, string value, MatchMode matchMode)
3737
{
3838
this.projection = projection;
3939
this.value = matchMode.ToMatchString(value);
40-
typedValue = new TypedValue(NHibernateUtil.String, this.value);
40+
typedValue = new TypedValue(NHibernateUtil.String, this.value, false);
4141
}
4242

4343

@@ -112,4 +112,4 @@ public override string ToString()
112112
return projection + " like " + value;
113113
}
114114
}
115-
}
115+
}

src/NHibernate/Engine/TypedValue.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,30 @@ public sealed class TypedValue
1717
private readonly object value;
1818
private readonly IEqualityComparer<TypedValue> comparer;
1919

20-
// "value is ICollection": minimal logic, may not catch all cases, like HashSet<T>. Prefer
21-
// directly calling "TypedValue(IType type, object value, bool isList)" when knowing what is value.
22-
public TypedValue(IType type, object value) : this (type, value, value is ICollection)
20+
/// <summary>
21+
/// Constructor for typed value that may represent a simple value or a list value (for a parameter list).
22+
/// If knowing what is value, use <see cref="TypedValue(IType, object, bool)"/> instead.
23+
/// </summary>
24+
/// <param name="type">The type of the value (or of its elements if it is a list value)</param>
25+
/// <param name="value">The value.</param>
26+
/// <remarks>The logic for infering if the value should be considered as a list value is minimal and will not
27+
/// catch all cases, like hashset.</remarks>
28+
public TypedValue(IType type, object value) : this (type, value, !type.IsCollectionType && value is ICollection && !type.ReturnedClass.IsArray)
2329
{
2430
}
2531

32+
/// <summary>
33+
/// Construct a typed value.
34+
/// </summary>
35+
/// <param name="type">The type of the value (or of its elements if it is a list value)</param>
36+
/// <param name="value">The value.</param>
37+
/// <param name="isList"><see langword="true" /> if the value is a list value (for a parameter list),
38+
/// <see langword="false" /> otherwise.</param>
2639
public TypedValue(IType type, object value, bool isList)
2740
{
2841
this.type = type;
2942
this.value = value;
30-
if (isList && !type.IsCollectionType && !type.ReturnedClass.IsArray)
31-
comparer = new ParameterListComparer();
32-
else
33-
comparer = new DefaultComparer();
43+
comparer = isList ? (IEqualityComparer<TypedValue>) new ParameterListComparer() : new DefaultComparer();
3444
}
3545

3646
public object Value

src/NHibernate/Impl/AbstractQueryImpl.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private string ExpandParameterList(string query, string name, TypedValue typedLi
241241
var type = typedList.Type;
242242

243243
var typedValues = (from object value in vals
244-
select new TypedValue(type, value))
244+
select new TypedValue(type, value, false))
245245
.ToList();
246246

247247
if (typedValues.Count == 1)
@@ -300,7 +300,7 @@ public IQuery SetParameter(string name, object val, IType type)
300300
}
301301
else
302302
{
303-
namedParameters[name] = new TypedValue(type, val);
303+
namedParameters[name] = new TypedValue(type, val, false);
304304
return this;
305305
}
306306
}

src/NHibernate/Impl/ExpressionQueryImpl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ protected override IQueryExpression ExpandParameters(IDictionary<string, TypedVa
5252
var type = me.Value.Type;
5353

5454
var typedValues = (from object value in vals
55-
select new TypedValue(type, value))
55+
select new TypedValue(type, value, false))
5656
.ToList();
5757

5858
if (typedValues.Count == 1)

src/NHibernate/Loader/Collection/CollectionLoader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ protected SqlString GetSubSelectWithLimits(SqlString subquery, ICollection<IPara
9292
var skipParameter = new NamedParameterSpecification(1, 0, skipParameterName) { ExpectedType = NHibernateUtil.Int32 };
9393
skipSqlParameter = Parameter.Placeholder;
9494
skipSqlParameter.BackTrack = skipParameter.GetIdsForBackTrack(sessionFactory).First();
95-
parameters.Add(skipParameterName, new TypedValue(skipParameter.ExpectedType, skip.Value));
95+
parameters.Add(skipParameterName, new TypedValue(skipParameter.ExpectedType, skip.Value, false));
9696
parameterSpecs.Add(skipParameter);
9797
}
9898
if (take.HasValue)
@@ -101,7 +101,7 @@ protected SqlString GetSubSelectWithLimits(SqlString subquery, ICollection<IPara
101101
var takeParameter = new NamedParameterSpecification(1, 0, takeParameterName) { ExpectedType = NHibernateUtil.Int32 };
102102
takeSqlParameter = Parameter.Placeholder;
103103
takeSqlParameter.BackTrack = takeParameter.GetIdsForBackTrack(sessionFactory).First();
104-
parameters.Add(takeParameterName, new TypedValue(takeParameter.ExpectedType, take.Value));
104+
parameters.Add(takeParameterName, new TypedValue(takeParameter.ExpectedType, take.Value, false));
105105
parameterSpecs.Add(takeParameter);
106106
}
107107

@@ -112,4 +112,4 @@ protected SqlString GetSubSelectWithLimits(SqlString subquery, ICollection<IPara
112112
return subquery;
113113
}
114114
}
115-
}
115+
}

src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,13 +815,13 @@ public ICollection<NamedParameter> CollectedParameters
815815

816816
public Parameter CreateSkipParameter(int value)
817817
{
818-
var typedValue = new TypedValue(NHibernateUtil.Int32, value);
818+
var typedValue = new TypedValue(NHibernateUtil.Int32, value, false);
819819
return NewQueryParameter("skip_", typedValue).Single();
820820
}
821821

822822
public Parameter CreateTakeParameter(int value)
823823
{
824-
var typedValue = new TypedValue(NHibernateUtil.Int32, value);
824+
var typedValue = new TypedValue(NHibernateUtil.Int32, value, false);
825825
return NewQueryParameter("take_",typedValue).Single();
826826
}
827827

0 commit comments

Comments
 (0)