Come posso creare un albero delle espressioni che paragona le proprietà in un oggetto figlio?

c# expression-trees lambda

Domanda

Come posso creare un albero delle espressioni che paragona le proprietà in un oggetto figlio?

Ad esempio, posso già creare un albero di espressione lambda che confronta le proprietà dirette di un oggetto. Come questo:

var propertyName = "JobNumber";
var propertyValue = "1005";
Type entityType = typeof(ParentObject);
OperatorDelegate comparisonMethod = Expression.Equal;

var parameter = Expression.Parameter(entityType, "entity");
var lambda =
    Expression.Lambda<Func<ParentObject, bool>>(
        comparisonMethod(Expression.Property(parameter, propertyName), Expression.Constant(propertyValue)),
        parameter);

Che è (credo) equivalente a:

entity => entity.JobNumber == "1005";

Dove mi sto bloccando sta cercando di capire come confrontare i valori nelle proprietà di un oggetto figlio. Ad esempio, dato:

public class ParentObject
{
    public ChildObject Child { get; set; }

    // more properties of ParentObject
}

public class ChildObject
{
    public string JobNumber { get; set; }
}

Come potrei costruire un'espressione che è l'equivalente di:

parentEntity => parentEntity.Child.JobNumber == "1005"

Grazie per qualsiasi aiuto.

Risposta accettata

Hai solo bisogno di ottenere la proprietà del valore della proprietà restituita:

var child = Expression.Property(parameter, "Child");
var jobNumber = Expression.Property(child, propertyName);

var lambda =
    Expression.Lambda<Func<ParentObject, bool>>(
        comparisonMethod(jobNumber, Expression.Constant(propertyValue)),
        parameter);


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché