diff --git a/src/NHibernate.Test/Linq/QueryReadOnlyTests.cs b/src/NHibernate.Test/Linq/QueryReadOnlyTests.cs
new file mode 100644
index 00000000000..7d315ad8653
--- /dev/null
+++ b/src/NHibernate.Test/Linq/QueryReadOnlyTests.cs
@@ -0,0 +1,59 @@
+using System.Linq;
+using NHibernate.Cfg;
+using NHibernate.Linq;
+using NUnit.Framework;
+
+namespace NHibernate.Test.Linq
+{
+ public class QueryReadOnlyTests : LinqTestCase
+ {
+ [Test]
+ public void CanSetReadOnlyOnLinqQueries()
+ {
+ var result = (from e in db.Customers
+ where e.CompanyName == "Bon app'"
+ select e).AsReadOnly().ToList();
+
+ Assert.That(result.All(x => this.session.IsReadOnly(x)), Is.True);
+ }
+
+
+ [Test]
+ public void CanSetReadOnlyOnLinqPagingQuery()
+ {
+ var result = (from e in db.Customers
+ select e).Skip(1).Take(1).AsReadOnly().ToList();
+
+ Assert.That(result.All(x => this.session.IsReadOnly(x)), Is.True);
+ }
+
+
+ [Test]
+ public void CanSetReadOnlyBeforeSkipOnLinqOrderedPageQuery()
+ {
+ var result = (from e in db.Customers
+ orderby e.CompanyName
+ select e)
+ .AsReadOnly().Skip(5).Take(5).ToList();
+
+ Assert.That(result.All(x => this.session.IsReadOnly(x)), Is.True);
+ }
+
+ [Test]
+ public void CanSetReadOnlyOnLinqGroupPageQuery()
+ {
+ var subQuery = db.Customers.Where(e2 => e2.CompanyName.Contains("a")).Select(e2 => e2.CustomerId)
+ .AsReadOnly(); // This AsReadOnly() should not cause trouble, and be ignored.
+
+ var result = (from e in db.Customers
+ where subQuery.Contains(e.CustomerId)
+ group e by e.CompanyName
+ into g
+ select new { g.Key, Count = g.Count() })
+ .Skip(5).Take(5)
+ .AsReadOnly().ToList();
+
+ Assert.That(result.All(x => this.session.IsReadOnly(x)), Is.True);
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj
index 9c8bd6d397d..0490b639b23 100644
--- a/src/NHibernate.Test/NHibernate.Test.csproj
+++ b/src/NHibernate.Test/NHibernate.Test.csproj
@@ -547,6 +547,7 @@
+
diff --git a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
index 8150d0ae5df..603a9b211ad 100644
--- a/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
+++ b/src/NHibernate/Linq/GroupBy/AggregatingGroupByRewriter.cs
@@ -40,6 +40,7 @@ public static class AggregatingGroupByRewriter
typeof (AnyResultOperator),
typeof (AllResultOperator),
typeof (TimeoutResultOperator),
+ typeof (AsReadOnlyResultOperator),
typeof (CacheableResultOperator)
};
diff --git a/src/NHibernate/Linq/LinqExtensionMethods.cs b/src/NHibernate/Linq/LinqExtensionMethods.cs
index dafee708975..47f9376089f 100755
--- a/src/NHibernate/Linq/LinqExtensionMethods.cs
+++ b/src/NHibernate/Linq/LinqExtensionMethods.cs
@@ -58,6 +58,15 @@ public static IQueryable CacheRegion(this IQueryable query, string regi
return new NhQueryable(query.Provider, callExpression);
}
+ public static IQueryable AsReadOnly(this IQueryable query)
+ {
+ var method = ReflectionHelper.GetMethodDefinition(() => AsReadOnly