private Expression GetItemNameExpression(ItemNode itemNode) { Expression nameExpression; if (itemNode.HasFlag(NodeFlags.Source)) { nameExpression = Expression.Property(Expression.Property(this.args.Source, nameof(IField.Identity)), nameof(FieldIdentity.Name)); } else if (itemNode.List != null) { Expression enumerator = this.GetEnumeratorExpression(itemNode.List); Expression list = this.GetFieldExpression(itemNode.List); Expression listName = Expression.Property(Expression.Property(list, nameof(IField.Identity)), nameof(FieldIdentity.Name)); Expression itemName = Expression.Constant(itemNode.Metadata.Identity.Notation.Path(itemNode.List.Metadata.Identity.Name, itemNode.Metadata.Identity.Name)); Expression combined = this.GetNotationCombine(listName, itemName); Expression index = Expression.Property(enumerator, nameof(IndexedEnumerator <object> .Index)); Expression indexed = this.GetNotationIndex(combined, index); nameExpression = indexed; } else { throw new InvalidOperationException(); } return(nameExpression); }