У меня есть тип Entity, который является открытым типом, объявленным так:
public class PseudoValue
{
public string Value { get; set; }
}
public class Entity
{
[Key]
public ulong Id { get; set; }
public IDictionary<string, object> DynamicProperties { get; set; }
}
где-то по пути, я добавляю динамическое свойство к моему Entity следующим образом:
propertiesMap.TryAdd("explicitAdd", new PseudoValue { Value = "Types" });
Когда я пытаюсь запросить мои данные следующим образом
~/api/Entities/?$filter=explicitAdd/App.PseudoValue/Value eq 'Types'
я получаю исключение
Запрос, указанный в URI, недопустим.Обнаружен неверный тип приведения.«App.PseudoValue» нельзя назначить из «».
Похоже, это связано с тем, что приведение не может работать, потому что тип свойства explicitAdd
является открытымтипа, и выбрасывается из этой функции в UriEdmHelpers.cs
/// <summary>
/// Check whether the parent and child are properly related types
/// </summary>
/// <param name="parentType">the parent type</param>
/// <param name="childType">the child type</param>
/// <exception cref="ODataException">Throws if the two types are not related.</exception>
public static void CheckRelatedTo(IEdmType parentType, IEdmType childType)
{
if (!IsRelatedTo(parentType, childType))
{
// If the parentType is an open property, parentType will be null and can't have an ODataFullName.
string parentTypeName = (parentType != null) ? parentType.FullTypeName() : "<null>";
throw new ODataException(Strings.MetadataBinder_HierarchyNotFollowed(childType.FullTypeName(), parentTypeName));
}
}
Если вместо этого я добавляю свое свойство следующим образом:
propertiesMap.TryAdd("thisWorks", "Types");
этот запрос успешно выполняется:
~/api/Entities/?$filter=thisWorks eq 'Types'
Можно ли как-нибудь избежать проверки типов, чтобы первый пример мог быть написан так?
~/api/Entities/?$filter=explicitAdd/Value eq 'Types'