diff --git a/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs b/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs index 535b7ce..6d0c970 100644 --- a/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs +++ b/src/EntityFrameworkCore.Projectables.Generator/ExpressionSyntaxRewriter.cs @@ -34,6 +34,21 @@ public ExpressionSyntaxRewriter(INamedTypeSymbol targetTypeSymbol, NullCondition .WithLeadingTrivia(node.GetLeadingTrivia()) .WithTrailingTrivia(node.GetTrailingTrivia()); } + + public override SyntaxNode? VisitMemberAccessExpression(MemberAccessExpressionSyntax node) + { + var expressionSyntax = (ExpressionSyntax?)Visit(node.Expression) ?? throw new ArgumentNullException("expression"); + + var syntaxNode = Visit(node.Name); + + // Prevents invalid cast when visiting a QualifiedNameSyntax + if (syntaxNode is QualifiedNameSyntax qst) + { + syntaxNode = qst.Right; + } + + return node.Update(expressionSyntax, VisitToken(node.OperatorToken), (SimpleNameSyntax)syntaxNode); + } public override SyntaxNode? VisitInvocationExpression(InvocationExpressionSyntax node) { diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.verified.txt b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.verified.txt new file mode 100644 index 0000000..7a1668a --- /dev/null +++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.QualifiedNameSyntaxTest.verified.txt @@ -0,0 +1,2 @@ +SELECT 7 +FROM [Entity] AS [e] \ No newline at end of file diff --git a/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.cs b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.cs new file mode 100644 index 0000000..0803a94 --- /dev/null +++ b/tests/EntityFrameworkCore.Projectables.FunctionalTests/NameSyntaxTests.cs @@ -0,0 +1,44 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using EntityFrameworkCore.Projectables.FunctionalTests.Helpers; +using Microsoft.EntityFrameworkCore; +using VerifyXunit; +using Xunit; + +namespace EntityFrameworkCore.Projectables.FunctionalTests +{ + public class Local + { + [Flags] + public enum SampleEnum + { + One = 0b001, + Two = 0b010, + Four = 0b100, + } + } + + [UsesVerify] + public class NameSyntaxTests + { + public class Entity + { + public int Id { get; set; } + + [Projectable] + public Local.SampleEnum? Test => Local.SampleEnum.One | Local.SampleEnum.Two | Local.SampleEnum.Four; + } + + [Fact] + public Task QualifiedNameSyntaxTest() + { + using var dbContext = new SampleDbContext(); + + var query = dbContext.Set() + .Select(x => x.Test); + + return Verifier.Verify(query.ToQueryString()); + } + } +}