Skip to content

Commit ebcac42

Browse files
committed
Implement IQueryable<T> support for PersistentGenericList
1 parent 3a7fc76 commit ebcac42

File tree

2 files changed

+64
-2
lines changed

2 files changed

+64
-2
lines changed

src/NHibernate.Test/NHSpecificTest/NH2319/Fixture.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ public void TestFilter()
119119

120120
protected override void Configure(Configuration configuration)
121121
{
122+
configuration.SetProperty("show_sql", "true");
122123
configuration.SetProperty("generate_statistics", "true");
123124
}
124125

@@ -261,4 +262,50 @@ protected override HbmMapping GetMappings()
261262
return mapper.CompileMappingForAllExplicitlyAddedEntities();
262263
}
263264
}
265+
266+
[TestFixture]
267+
public class ListFixture : FixtureBase
268+
{
269+
protected override HbmMapping GetMappings()
270+
{
271+
var mapper = new ModelMapper();
272+
mapper.Class<Parent>(rc =>
273+
{
274+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
275+
rc.Property(x => x.Name);
276+
rc.List(
277+
x => x.Children,
278+
list =>
279+
{
280+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
281+
list.Index(i => i.Column("i"));
282+
},
283+
rel => rel.OneToMany());
284+
});
285+
286+
mapper.Class<Child>(rc =>
287+
{
288+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
289+
rc.Property(x => x.Name);
290+
rc.ManyToOne(x => x.Parent);
291+
rc.List(
292+
c => c.GrandChildren,
293+
list =>
294+
{
295+
list.Cascade(Mapping.ByCode.Cascade.All | Mapping.ByCode.Cascade.DeleteOrphans);
296+
list.Index(i => i.Column("i"));
297+
},
298+
rel => rel.OneToMany());
299+
});
300+
301+
mapper.Class<GrandChild>(rc =>
302+
{
303+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
304+
rc.Property(x => x.Name);
305+
rc.ManyToOne(x => x.Child, x => x.Column("child_id"));
306+
});
307+
308+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
309+
}
310+
}
264311
}

src/NHibernate/Collection/Generic/PersistentGenericList.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
using System.Collections.Generic;
44
using System.Data.Common;
55
using System.Diagnostics;
6+
using System.Linq;
7+
using System.Linq.Expressions;
68
using NHibernate.DebugHelpers;
79
using NHibernate.Engine;
10+
using NHibernate.Linq;
811
using NHibernate.Loader;
912
using NHibernate.Persister.Collection;
1013
using NHibernate.Type;
@@ -19,7 +22,7 @@ namespace NHibernate.Collection.Generic
1922
/// <remarks>The underlying collection used is a <see cref="List{T}"/></remarks>
2023
[Serializable]
2124
[DebuggerTypeProxy(typeof (CollectionProxy<>))]
22-
public class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IList
25+
public class PersistentGenericList<T> : AbstractPersistentCollection, IList<T>, IList, IQueryable<T>
2326
{
2427
protected IList<T> WrappedList;
2528

@@ -497,7 +500,6 @@ IEnumerator IEnumerable.GetEnumerator()
497500

498501
#endregion
499502

500-
501503
#region IEnumerable<T> Members
502504

503505
IEnumerator<T> IEnumerable<T>.GetEnumerator()
@@ -507,7 +509,20 @@ IEnumerator<T> IEnumerable<T>.GetEnumerator()
507509
}
508510

509511
#endregion
512+
513+
#region IQueryable<T> Members
514+
515+
IQueryable<T> _queryable;
516+
517+
Expression IQueryable.Expression => InnerQueryable.Expression;
518+
519+
System.Type IQueryable.ElementType => InnerQueryable.ElementType;
510520

521+
IQueryProvider IQueryable.Provider => InnerQueryable.Provider;
522+
523+
IQueryable<T> InnerQueryable => _queryable ?? (_queryable = new NhQueryable<T>(Session, this));
524+
525+
#endregion
511526

512527
#region DelayedOperations
513528

0 commit comments

Comments
 (0)