diff --git a/.gitignore b/.gitignore index 0359270..269dc48 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ Thumbs.db /*.shfbproj_* /*.dotCover _ReSharper.* +/.vs diff --git a/NHibernate.OData.Test/Domain/Model.hbm.xml b/NHibernate.OData.Test/Domain/Model.hbm.xml index 4a6ecde..f3571e3 100644 --- a/NHibernate.OData.Test/Domain/Model.hbm.xml +++ b/NHibernate.OData.Test/Domain/Model.hbm.xml @@ -13,6 +13,10 @@ + + + + diff --git a/NHibernate.OData.Test/Domain/Parent.cs b/NHibernate.OData.Test/Domain/Parent.cs index 234d31d..030d876 100644 --- a/NHibernate.OData.Test/Domain/Parent.cs +++ b/NHibernate.OData.Test/Domain/Parent.cs @@ -21,6 +21,8 @@ public class Parent : IEntity public virtual ISet RelatedParents { get; set; } + public virtual IEnumerable EnumerableRelatedParents { get; set; } + public override string ToString() { return Name; diff --git a/NHibernate.OData.Test/Issues/Issue23Fixture.cs b/NHibernate.OData.Test/Issues/Issue23Fixture.cs new file mode 100644 index 0000000..7a268e1 --- /dev/null +++ b/NHibernate.OData.Test/Issues/Issue23Fixture.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NHibernate.OData.Test.Domain; +using NHibernate.OData.Test.Support; +using NUnit.Framework; + +namespace NHibernate.OData.Test.Issues +{ + [TestFixture] + internal class Issue23Fixture : DomainTestFixture + { + [Test] + public void InterfacePropertNotRecognizedAsCollection() + { + Verify( + "EnumerableRelatedParents/any(o: o/Int32 eq 9)", + Session.QueryOver().Where(x => x.Name == "Parent 10").List() + ); + } + } +} diff --git a/NHibernate.OData.Test/NHibernate.OData.Test.csproj b/NHibernate.OData.Test/NHibernate.OData.Test.csproj index a6a60c6..adf020f 100644 --- a/NHibernate.OData.Test/NHibernate.OData.Test.csproj +++ b/NHibernate.OData.Test/NHibernate.OData.Test.csproj @@ -79,6 +79,7 @@ + diff --git a/NHibernate.OData.Test/Support/DomainTestFixture.cs b/NHibernate.OData.Test/Support/DomainTestFixture.cs index 09b1d8d..af28e93 100644 --- a/NHibernate.OData.Test/Support/DomainTestFixture.cs +++ b/NHibernate.OData.Test/Support/DomainTestFixture.cs @@ -80,7 +80,7 @@ private void PopulateDatabase() { "DynamicInt", i }, { "DynamicChildRef", previousChild }, }, - RelatedParents = new HashSet(parents), + RelatedParents = new HashSet(parents) }; if (i == 10) @@ -105,6 +105,8 @@ private void PopulateDatabase() if (i == 10) parent.RelatedParents = new HashSet(parents.Where(x => x.Int32 >= 5)); + parent.EnumerableRelatedParents = parent.RelatedParents; + session.Save(parent); parents.Add(parent); diff --git a/NHibernate.OData/TypeUtil.cs b/NHibernate.OData/TypeUtil.cs index 7269677..1c2f326 100644 --- a/NHibernate.OData/TypeUtil.cs +++ b/NHibernate.OData/TypeUtil.cs @@ -12,11 +12,19 @@ public static System.Type TryGetCollectionItemType(System.Type collectionType) if (collectionType == null) return null; - System.Type enumerableType = collectionType.GetInterfaces().FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable<>)); + if (collectionType.IsInterface && IsCollectionType(collectionType)) + return collectionType.GetGenericArguments().Single(); + + System.Type enumerableType = collectionType.GetInterfaces().FirstOrDefault(IsCollectionType); if (enumerableType == null) return null; return enumerableType.GetGenericArguments().Single(); } + + private static bool IsCollectionType(System.Type type) + { + return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>); + } } }