82 lines
2.9 KiB
C#
82 lines
2.9 KiB
C#
|
//---------------------------------------------------------------------
|
|||
|
// <copyright file="ExplicitDiscriminatorMap.cs" company="Microsoft">
|
|||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|||
|
// </copyright>
|
|||
|
//
|
|||
|
// @owner [....]
|
|||
|
// @backupOwner [....]
|
|||
|
//---------------------------------------------------------------------
|
|||
|
|
|||
|
using System.Data.Metadata.Edm;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
|
|||
|
namespace System.Data.Query.InternalTrees
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Describes user-defined discriminator metadata (e.g. for a basic TPH mapping). Encapsulates
|
|||
|
/// relevant data from System.Data.Mapping.ViewGenerabetion.DiscriminatorMap (that is to say,
|
|||
|
/// data relevant to the PlanCompiler). This separate class accomplishes two things:
|
|||
|
///
|
|||
|
/// 1. Maintain separation of ViewGen and PlanCompiler
|
|||
|
/// 2. Avoid holding references to CQT expressions in ITree ops (which the ViewGen.DiscriminatorMap
|
|||
|
/// holds a few CQT references)
|
|||
|
/// </summary>
|
|||
|
internal class ExplicitDiscriminatorMap
|
|||
|
{
|
|||
|
private readonly System.Collections.ObjectModel.ReadOnlyCollection<KeyValuePair<object, EntityType>> m_typeMap;
|
|||
|
private readonly EdmMember m_discriminatorProperty;
|
|||
|
private readonly System.Collections.ObjectModel.ReadOnlyCollection<EdmProperty> m_properties;
|
|||
|
|
|||
|
internal ExplicitDiscriminatorMap(System.Data.Mapping.ViewGeneration.DiscriminatorMap template)
|
|||
|
{
|
|||
|
m_typeMap = template.TypeMap;
|
|||
|
m_discriminatorProperty = template.Discriminator.Property;
|
|||
|
m_properties = template.PropertyMap.Select(propertyValuePair => propertyValuePair.Key)
|
|||
|
.ToList().AsReadOnly();
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Maps from discriminator value to type.
|
|||
|
/// </summary>
|
|||
|
internal System.Collections.ObjectModel.ReadOnlyCollection<KeyValuePair<object, EntityType>> TypeMap
|
|||
|
{
|
|||
|
get { return m_typeMap; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Gets property containing discriminator value.
|
|||
|
/// </summary>
|
|||
|
internal EdmMember DiscriminatorProperty
|
|||
|
{
|
|||
|
get { return m_discriminatorProperty; }
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// All properties for the type hierarchy.
|
|||
|
/// </summary>
|
|||
|
internal System.Collections.ObjectModel.ReadOnlyCollection<EdmProperty> Properties
|
|||
|
{
|
|||
|
get { return m_properties; }
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Returns the type id for the given entity type, or null if non exists.
|
|||
|
/// </summary>
|
|||
|
internal object GetTypeId(EntityType entityType)
|
|||
|
{
|
|||
|
object result = null;
|
|||
|
foreach (var discriminatorTypePair in this.TypeMap)
|
|||
|
{
|
|||
|
if (discriminatorTypePair.Value.EdmEquals(entityType))
|
|||
|
{
|
|||
|
result = discriminatorTypePair.Key;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|