Repository: ignite Updated Branches: refs/heads/ignite-4985 8d18e477f -> 38f74b37a
IGNITE-4460 .NET: Validate From clauses in LINQ Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a7d3e1bc Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a7d3e1bc Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a7d3e1bc Branch: refs/heads/ignite-4985 Commit: a7d3e1bcdbd5a425acf1a47615432d26794df057 Parents: 727d76b Author: Pavel Tupitsyn <[email protected]> Authored: Mon Apr 17 13:48:14 2017 +0300 Committer: Pavel Tupitsyn <[email protected]> Committed: Mon Apr 17 13:48:14 2017 +0300 ---------------------------------------------------------------------- .../Cache/Query/CacheLinqTest.cs | 14 ++++++++++++++ .../Impl/CacheQueryModelVisitor.cs | 15 +++++++++++++++ 2 files changed, 29 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a7d3e1bc/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs index 0b2bb3e..876b0be 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Query/CacheLinqTest.cs @@ -612,6 +612,20 @@ namespace Apache.Ignite.Core.Tests.Cache.Query } /// <summary> + /// Tests the SelectMany from field collection. + /// </summary> + [Test] + public void TestSelectManySameTable() + { + var persons = GetPersonCache().AsCacheQueryable(); + + // ReSharper disable once ReturnValueOfPureMethodIsNotUsed + var ex = Assert.Throws<NotSupportedException>(() => persons.SelectMany(x => x.Value.Name).ToArray()); + + Assert.IsTrue(ex.Message.StartsWith("FROM clause must be IQueryable: from Char")); + } + + /// <summary> /// Tests the group by. /// </summary> [Test] http://git-wip-us.apache.org/repos/asf/ignite/blob/a7d3e1bc/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/CacheQueryModelVisitor.cs ---------------------------------------------------------------------- diff --git a/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/CacheQueryModelVisitor.cs b/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/CacheQueryModelVisitor.cs index 7cc9265..2cf4420 100644 --- a/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/CacheQueryModelVisitor.cs +++ b/modules/platforms/dotnet/Apache.Ignite.Linq/Impl/CacheQueryModelVisitor.cs @@ -348,15 +348,30 @@ namespace Apache.Ignite.Linq.Impl base.VisitMainFromClause(fromClause, queryModel); _builder.AppendFormat("from "); + ValidateFromClause(fromClause); _aliases.AppendAsClause(_builder, fromClause).Append(" "); foreach (var additionalFrom in queryModel.BodyClauses.OfType<AdditionalFromClause>()) { _builder.AppendFormat(", "); + ValidateFromClause(additionalFrom); _aliases.AppendAsClause(_builder, additionalFrom).Append(" "); } } + /// <summary> + /// Validates from clause. + /// </summary> + // ReSharper disable once UnusedParameter.Local + private static void ValidateFromClause(IFromClause clause) + { + // Only IQueryable can be used in FROM clause. IEnumerable is not supported. + if (!typeof(IQueryable).IsAssignableFrom(clause.FromExpression.Type)) + { + throw new NotSupportedException("FROM clause must be IQueryable: " + clause); + } + } + /** <inheritdoc /> */ [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods")] public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
