From: <fab...@us...> - 2010-12-15 22:21:10
|
Revision: 5319 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5319&view=rev Author: fabiomaulo Date: 2010-12-15 22:21:00 +0000 (Wed, 15 Dec 2010) Log Message: ----------- - added FirstOrNull enumerable extension - refactoring Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/FirstOrNullExtensionTests.cs Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2010-12-15 22:09:18 UTC (rev 5318) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractQueryImpl.cs 2010-12-15 22:21:00 UTC (rev 5319) @@ -682,7 +682,8 @@ return this; } - SetParameterList(name, vals, !vals.Any() ? GuessType(vals.GetCollectionElementType()) : DetermineType(name, vals.First())); + object firstValue = vals.FirstOrNull(); + SetParameterList(name, vals, firstValue == null ? GuessType(vals.GetCollectionElementType()) : DetermineType(name, firstValue)); return this; } Modified: trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs 2010-12-15 22:09:18 UTC (rev 5318) +++ trunk/nhibernate/src/NHibernate/Util/EnumerableExtensions.cs 2010-12-15 22:21:00 UTC (rev 5319) @@ -48,6 +48,33 @@ throw new InvalidOperationException("Sequence contains no elements"); } + public static object FirstOrNull(this IEnumerable source) + { + if (source == null) + { + throw new ArgumentNullException("source"); + } + IList collection = source as IList; + if (collection != null) + { + if (collection.Count > 0) + { + return collection[0]; + } + } + else + { + using (DisposableEnumerator enumerator = source.GetDisposableEnumerator()) + { + if (enumerator.MoveNext()) + { + return enumerator.Current; + } + } + } + return null; + } + private static DisposableEnumerator GetDisposableEnumerator(this IEnumerable source) { return new DisposableEnumerator(source); Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-15 22:09:18 UTC (rev 5318) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-15 22:21:00 UTC (rev 5319) @@ -582,6 +582,7 @@ <Compile Include="TypesTest\XmlDocTypeFixture.cs" /> <Compile Include="UtilityTest\EnumerableExtensionsTests\AnyExtensionTests.cs" /> <Compile Include="UtilityTest\EnumerableExtensionsTests\FirstExtensionTests.cs" /> + <Compile Include="UtilityTest\EnumerableExtensionsTests\FirstOrNullExtensionTests.cs" /> <Compile Include="UtilityTest\ReflectionHelperIsMethodOfTests.cs" /> <Compile Include="UtilityTest\ReflectionHelperTest.cs" /> <Compile Include="Linq\RegresstionTests.cs" /> Added: trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/FirstOrNullExtensionTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/FirstOrNullExtensionTests.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/UtilityTest/EnumerableExtensionsTests/FirstOrNullExtensionTests.cs 2010-12-15 22:21:00 UTC (rev 5319) @@ -0,0 +1,29 @@ +using System; +using System.Collections; +using NHibernate.Util; +using NUnit.Framework; +using SharpTestsEx; + +namespace NHibernate.Test.UtilityTest.EnumerableExtensionsTests +{ + public class FirstOrNullExtensionTests + { + [Test] + public void WhenNullThenThenThrows() + { + Executing.This(() => ((IEnumerable)null).FirstOrNull()).Should().Throw<ArgumentNullException>(); + } + + [Test] + public void WhenHasElementsThenReturnFirst() + { + (new[] { 2, 1 }).FirstOrNull().Should().Be(2); + } + + [Test] + public void WhenEmptyThenReturnNull() + { + (new object[0]).FirstOrNull().Should().Be.Null(); + } + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |