private static void VerifyTypeSupportedForComparison(Type clrType, TypeUsage edmType, Stack<EdmMember> memberPath, bool isNullComparison)
{
// NOTE: due to bug in null handling for complex types, complex types are currently not supported
// for comparisons (see SQL BU 543956)
switch (edmType.EdmType.BuiltInTypeKind)
{
case BuiltInTypeKind.PrimitiveType:
case BuiltInTypeKind.EnumType:
case BuiltInTypeKind.EntityType:
case BuiltInTypeKind.RefType:
return;
case BuiltInTypeKind.RowType:
{
InitializerMetadata initializerMetadata;
if (!InitializerMetadata.TryGetInitializerMetadata(edmType, out initializerMetadata)
||
initializerMetadata.Kind == InitializerMetadataKind.ProjectionInitializer
||
initializerMetadata.Kind == InitializerMetadataKind.ProjectionNew)
{
if (!isNullComparison)
{
VerifyRowTypeSupportedForComparison(clrType, (RowType)edmType.EdmType, memberPath, isNullComparison);
}
return;
}
break;
}
default:
break;
}
if (null == memberPath)
{
throw new NotSupportedException(Strings.ELinq_UnsupportedComparison(DescribeClrType(clrType)));
}
else
{
// build up description of member path
var memberPathDescription = new StringBuilder();
foreach (var member in memberPath)
{
memberPathDescription.Append(Strings.ELinq_UnsupportedRowMemberComparison(member.Name));
}
memberPathDescription.Append(Strings.ELinq_UnsupportedRowTypeComparison(DescribeClrType(clrType)));
throw new NotSupportedException(Strings.ELinq_UnsupportedRowComparison(memberPathDescription.ToString()));
}
}