forked from william-liebenberg/AzureGems
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCosmosDbPartitionKeyResolver.cs
39 lines (33 loc) · 1.17 KB
/
CosmosDbPartitionKeyResolver.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace AzureGems.Repository.CosmosDB
{
public class CosmosDbPartitionKeyResolver : IPartitionKeyResolver
{
public string ResolvePartitionKeyValue(string partitionKeyPath, object entityInstance)
{
// e.g. partitionKeyPath = "/id"
// pkPath = "/brand"
// pkPath = "/something/somethingelse"
string[] pathTokens = partitionKeyPath.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
return ResolvePathValue(pathTokens, entityInstance);
}
private string ResolvePathValue(IEnumerable<string> pathTokens, object entityInstance)
{
string propertyName = pathTokens.First();
// get the value for the first path token
Type entityType = entityInstance.GetType();
object subEntityInstance = entityType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.FirstOrDefault(p => string.Equals(p.Name, propertyName, StringComparison.OrdinalIgnoreCase))
.GetValue(entityInstance);
if (pathTokens.Count() > 1)
{
return ResolvePathValue(pathTokens.Skip(1), subEntityInstance);
}
return Convert.ToString(subEntityInstance);
}
}
}