From e9978a65dd2a283ac66fc9322fe39a17d70965a2 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Tue, 21 Apr 2026 20:13:15 -0700 Subject: [PATCH 1/2] Fix bug with inner `.Count(predicate)` translation --- ...Github0114_QueryRootReuseCauseNoRefJoin.cs | 2 +- Orm/Xtensive.Orm.Tests/Issues/Issue_Count.cs | 29 +++++++++++++++++++ .../Orm/Linq/Translator.Queryable.cs | 6 ++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 Orm/Xtensive.Orm.Tests/Issues/Issue_Count.cs diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueGithub0114_QueryRootReuseCauseNoRefJoin.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueGithub0114_QueryRootReuseCauseNoRefJoin.cs index cceaee5965..87c3896940 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueGithub0114_QueryRootReuseCauseNoRefJoin.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueGithub0114_QueryRootReuseCauseNoRefJoin.cs @@ -121,7 +121,7 @@ public User(Session session, string name) namespace Xtensive.Orm.Tests.Issues { [TestFixture] - public sealed class IssueGithub0114_QueryRootReuseCauseNoRefJoin : AutoBuildTest + public sealed partial class IssueGithub0114_QueryRootReuseCauseNoRefJoin : AutoBuildTest { protected override DomainConfiguration BuildConfiguration() { diff --git a/Orm/Xtensive.Orm.Tests/Issues/Issue_Count.cs b/Orm/Xtensive.Orm.Tests/Issues/Issue_Count.cs new file mode 100644 index 0000000000..acbe50be4e --- /dev/null +++ b/Orm/Xtensive.Orm.Tests/Issues/Issue_Count.cs @@ -0,0 +1,29 @@ +using NUnit.Framework; +using Xtensive.Orm.Tests.Issues.IssueGithub0114_QueryRootReuseCauseNoRefJoinModel; + +namespace Xtensive.Orm.Tests.Issues; + +[TestFixture] +public sealed partial class IssueGithub0114_QueryRootReuseCauseNoRefJoin : AutoBuildTest +{ + [Test] + public void InnerWhere() + { + using var session = Domain.OpenSession(); + using var tx = session.OpenTransaction(); + _ = session.Query.All().GroupBy(p => p.Id).Select(g => + g.Where(x => x.CampainName == null).Count() + ).ToArray(); + } + + [Test] + public void InnerCount() + { + using var session = Domain.OpenSession(); + using var tx = session.OpenTransaction(); + _ = session.Query.All().GroupBy(p => p.Id).Select(g => + g.Count(x => x.CampainName == null) + ).ToArray(); + } +} + diff --git a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs index 3dad38e871..e3c99f9a34 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs @@ -191,6 +191,12 @@ protected override Expression VisitQueryableMethod(MethodCallExpression mc, Quer break; case QueryableMethodKind.LongCount: case QueryableMethodKind.Count: + var src = mcArguments[0]; + if (argsCount == 2) { + using var _ = CreateScope(new TranslatorState(State) { BuildingProjection = false }); + src = VisitWhere(mcArguments[0], mcArguments[1].StripQuotes()); + } + return VisitAggregate(src, mc.Method, null, context.IsRoot(mc), mc); case QueryableMethodKind.Max: case QueryableMethodKind.Min: case QueryableMethodKind.Sum: From 8a1247ac4005d45adf122a4490cd3a049beafb67 Mon Sep 17 00:00:00 2001 From: Sergei Pavlov Date: Tue, 21 Apr 2026 21:16:12 -0700 Subject: [PATCH 2/2] Simplify --- Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs index e3c99f9a34..1bfc80b91e 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Translator.Queryable.cs @@ -194,7 +194,7 @@ protected override Expression VisitQueryableMethod(MethodCallExpression mc, Quer var src = mcArguments[0]; if (argsCount == 2) { using var _ = CreateScope(new TranslatorState(State) { BuildingProjection = false }); - src = VisitWhere(mcArguments[0], mcArguments[1].StripQuotes()); + src = VisitWhere(src, mcArguments[1].StripQuotes()); } return VisitAggregate(src, mc.Method, null, context.IsRoot(mc), mc); case QueryableMethodKind.Max: