public override Expression MemberExpression(MemberExpression expression)
{
var type = _persistentClass;
MappedClassMetadata mappedClass = null;
var members = expression.Members;
var lastAliasName = _rootAlias;
// If we are inside a lambda expression
if (_context.ExpressionLevel > 1)
{
// Lambda member expression MUST start with a variable name
var lambdaContext = _context.FindLambdaContext(members[0].Name);
if (lambdaContext == null)
throw new QueryException(ErrorMessages.Expression_LambdaMemberMustStartWithParameter);
type = lambdaContext.ParameterType;
lastAliasName = lambdaContext.ParameterAlias;
members = members.Skip(1).ToList();
}
else if (members[0].Name == "$it")
{
// Special case: $it variable outside of lambda expression
members = members.Skip(1).ToList();
}
if (type != null)
_context.SessionFactoryContext.MappedClassMetadata.TryGetValue(type, out mappedClass);
if (members.Count == 1)
{
Debug.Assert(members[0].IdExpression == null);
string resolvedName = ResolveName(mappedClass, string.Empty, members[0].Name, ref type);
return new ResolvedMemberExpression(
expression.MemberType,
(lastAliasName != null ? lastAliasName + "." : null) + resolvedName,
type
);
}
var sb = new StringBuilder();
for (int i = 0; i < members.Count; i++)
{
var member = members[i];
Debug.Assert(member.IdExpression == null);
bool isLastMember = i == members.Count - 1;
string resolvedName = ResolveName(mappedClass, sb.ToString(), member.Name, ref type);
if (sb.Length > 0)
sb.Append('.');
sb.Append(resolvedName);
if (type != null && _context.SessionFactoryContext.MappedClassMetadata.ContainsKey(type) && !isLastMember)
{
mappedClass = _context.SessionFactoryContext.MappedClassMetadata[type];
string path = (lastAliasName != null ? lastAliasName + "." : null) + sb;
Alias alias;
if (!Aliases.TryGetValue(path, out alias))
{
alias = new Alias(_context.CreateUniqueAliasName(), path, type);
Aliases.Add(path, alias);
_context.AddAlias(alias);
}
lastAliasName = alias.Name;
sb.Clear();
}
}
return new ResolvedMemberExpression(
expression.MemberType,
(lastAliasName != null ? lastAliasName + "." : null) + sb,
type
);
}