Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to generate a Select Expression with nested types? #837

Open
maddemon opened this issue Aug 16, 2024 · 1 comment
Open

How to generate a Select Expression with nested types? #837

maddemon opened this issue Aug 16, 2024 · 1 comment
Assignees
Labels

Comments

@maddemon
Copy link

maddemon commented Aug 16, 2024

I have two ViewModel types that are nested, and the Select statement I generate dynamically cannot correctly recognize the properties.

1. Description

My type definitions are as follows:

    [Table("project_sample")]
    public class ProjectSample : FormData
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
        [ForeignKey("Project")]
        public override string Id { get; set; } = string.Empty;
        [JsonIgnore]
        public virtual Project? Project { get; set; }
        public int? Result { get; set; }
        public string? Opinion { get; set; }
        [JsonIgnore]
        public virtual List<ProjectSampleExpertPoint>? ExpertPoints { get; set; }
    }

    [Table("project_smaple_expert_point")]
    public class ProjectSampleExpertPoint : FormData
    {
        public string? BatchId { get; set; }
        public string? ProjectSampleId { get; set; }
        [JsonIgnore]
        public virtual ProjectSample? ProjectSample { get; set; }
        public string? ExpertId { get; set; }
        [JsonIgnore]
        public virtual User? Expert { get; set; }
        public string? Opinion { get; set; }
        public int? Result { get; set; }
        [JsonIgnore]
        [Column("Attachment", TypeName = "JSON")]
        public string? AttachmentValue { get; set; }
        [NotMapped]
        public UploadFile? Attachment
        {
            get => AttachmentValue?.ToObject<UploadFile>();
            set => AttachmentValue = value?.ToJson();
        }
    }

    public class VProjectSample : ProjectSample
    {
        [Relation("Project.BatchId")]
        public string? BatchId { get; set; }
        [Relation("Project")]
        public new Project? Project { get; set; }
        [Relation("Project.Organization.FullName")]
        public string? OrganizationName { get; set; }
        [Relation("Project.Organization.Tel")]
        public string? OrganizationTel { get; set; }
    }

    public class VProjectSamplePoint : VProjectSample
    {
        [Relation("ExpertPoints")]
        public List<VProjectSampleExpertPoint>? Experts { get; set; }
    }

    public class VProjectSampleExpertPoint : ProjectSampleExpertPoint
    {
        [Relation("Expert.Name")]
        public string? ExpertName { get; set; }
    }

The Select string I generated is as follows:

	new {
		ExpertPoints.Select(new {
			Expert.Name AS ExpertName,
			BatchId,
			ProjectSampleId,
			ExpertId,
			Opinion,
			Result,
			AttachmentValue,
			CreateTime,
			UpdateTime,
			Deleted,
			Id
		}) AS Experts,
		
		Project.BatchId AS BatchId,
		Project AS Project,
		Project.Organization.FullName AS OrganizationName,
		Project.Organization.Tel AS OrganizationTel,
		Id,
		Result,
		Opinion,
		CreateTime,
		UpdateTime,
		Deleted
	}

My code:

  DynamicExpressionParser.ParseLambda<ProjectSample, VProjectSamplePoint>(new ParsingConfig { ResolveTypesBySimpleName = true,}, true, selectExp);

2. Exception

Exception message:No property or field 'ExpertName' exists in type 'VProjectSamplePoint'
Stack trace:at System.Linq.Dynamic.Core.Parser.ExpressionParser.CreateNewExpression(List`1 properties, List`1 expressions, Type newType) in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 1599\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNew() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 1476\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIdentifier() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 1016\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimaryStart() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 838\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParsePrimary() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 806\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseUnary() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 801\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseArithmetic() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 746\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAdditive() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 713\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseShiftOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 689\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseComparisonOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 479\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLogicalAndOrOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 411\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseIn() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 330\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseAndOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 313\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOrOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 295\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseLambdaOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 273\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseNullCoalescingOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 260\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseConditionalOperator() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 244\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseOutKeyword() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 196\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseArguments() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 2257\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.ParseArgumentList() in D:\\repos\\System.Linq.Dynamic.Core-1.4.4\\src\\System.Linq.Dynamic.Core\\Parser\\ExpressionParser.cs:line 2243\r\n   at System.Linq.Dynamic.Core.Parser.ExpressionParser.TryParseEnumerable(Expression instance, Type elementType, String methodName, Int32 errorPos, Type type, Expression[]& args, Expression& expression) 

3. Any further technical details

In my code, the nested Select ' AS Experts' should be the type 'VProjectSampleExpertPoint', but it does not automatically convert. How should I generate the correctly selectExp?

@StefH StefH added the question label Aug 24, 2024
@StefH StefH self-assigned this Oct 13, 2024
@StefH
Copy link
Collaborator

StefH commented Oct 13, 2024

@maddemon

  • can you please provide a full working example (without the attributes)
  • also instead of using DynamicExpressionParser.ParseLambda, use a normal select and

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

2 participants