diff --git a/src/NHibernate.Test/Linq/QueryAsReadOnlyTests.cs b/src/NHibernate.Test/Linq/QueryAsReadOnlyTests.cs
new file mode 100644
index 00000000000..1a736b66ee8
--- /dev/null
+++ b/src/NHibernate.Test/Linq/QueryAsReadOnlyTests.cs
@@ -0,0 +1,35 @@
+using System.Linq;
+using NHibernate.AdoNet;
+using NHibernate.Cfg;
+using NHibernate.Engine;
+using NHibernate.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.Linq
+{
+ public class QueryAsReadOnlyTests : LinqTestCase
+ {
+ [Test]
+ public void CanSetReadOnlyOnSimpeLinqQueries()
+ {
+ //NH-3658
+ var result = (from e in db.Customers
+ where e.CompanyName == "Corp"
+ select e).AsReadOnly().ToList();
+
+ Assert.IsTrue(result.All(x => session.IsReadOnly(x)));
+ }
+
+ [Test]
+ public void CanSetReadOnlyOnComplexLinqQueries()
+ {
+ //NH-3658
+ var result = (from e in db.Customers
+ where e.CompanyName == "Corp"
+ orderby e.ContactName
+ select e).Skip(1).Take(10).AsReadOnly().ToList();
+
+ Assert.IsTrue(result.All(x => session.IsReadOnly(x)));
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj
index 962022b5487..92eea56ce1e 100644
--- a/src/NHibernate.Test/NHibernate.Test.csproj
+++ b/src/NHibernate.Test/NHibernate.Test.csproj
@@ -519,6 +519,7 @@
+
diff --git a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
index 1bab0227632..00496ee8253 100644
--- a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
+++ b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
@@ -38,6 +38,7 @@ public static class AggregatingGroupByRewriter
typeof (AnyResultOperator),
typeof (AllResultOperator),
typeof (TimeoutResultOperator),
+ typeof (AsReadOnlyResultOperator),
};
public static void ReWrite(QueryModel queryModel)
diff --git a/src/NHibernate/Linq/LinqExtensionMethods.cs b/src/NHibernate/Linq/LinqExtensionMethods.cs
index e9ee33324f0..ef78bd3a686 100755
--- a/src/NHibernate/Linq/LinqExtensionMethods.cs
+++ b/src/NHibernate/Linq/LinqExtensionMethods.cs
@@ -20,6 +20,15 @@ public static IQueryable Query(this IStatelessSession session)
return new NhQueryable(session.GetSessionImplementation());
}
+ public static IQueryable AsReadOnly(this IQueryable query)
+ {
+ var method = ReflectionHelper.GetMethodDefinition(() => AsReadOnly