private DbExpression RecursivelyRewriteEqualsExpression(DbExpression left, DbExpression right, EqualsPattern pattern)
{
// check if either side is an initializer type
var leftType = left.ResultType.EdmType as RowType;
var rightType = right.ResultType.EdmType as RowType;
if (null != leftType
|| null != rightType)
{
if (null != leftType && null != rightType)
{
DbExpression shreddedEquals = null;
// if the types are the same, use struct equivalence semantics
foreach (var property in leftType.Properties)
{
var leftElement = left.Property(property);
var rightElement = right.Property(property);
var elementsEquals = RecursivelyRewriteEqualsExpression(
leftElement, rightElement, pattern);
// build up and expression
if (null == shreddedEquals)
{
shreddedEquals = elementsEquals;
}
else
{
shreddedEquals = shreddedEquals.And(elementsEquals);
}
}
return shreddedEquals;
}
else
{
// if one or both sides is an initializer and the types are not the same,
// "equals" always evaluates to false
return DbExpressionBuilder.False;
}
}
else
{
return
_funcletizer.RootContext.ContextOptions.UseCSharpNullComparisonBehavior
? ImplementEquality(left, right, EqualsPattern.Store)
: ImplementEquality(left, right, pattern);
}
}