public static async Task <HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/azuresearch/performance/blobstorage/serially/repetitions/{repetitions}")] HttpRequestMessage req, int repetitions, ExecutionContext executionContext, ILogger log) { List <string> ids = Common.IdsList; DateTime startTime = DateTime.Now; StorageCredentials storageCredentials = new StorageCredentials( Environment.GetEnvironmentVariable("storageAccountName", EnvironmentVariableTarget.Process), Environment.GetEnvironmentVariable("storageAccountKey", EnvironmentVariableTarget.Process)); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("providers"); List <KyruusDataStructure> providers = new List <KyruusDataStructure>(ids.Count); for (int r = 0; r < repetitions; r++) { foreach (string id in ids) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"ky-2019-04-25-16-00-00-0387-Utc/{id}.json"); string doc = await cloudBlockBlob.DownloadTextAsync(); KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(doc); providers.Add(p); } } return(req.CreateResponse( HttpStatusCode.OK, $"{repetitions} repetitions in {nameof(BlobStorageSerial)}->{executionContext.FunctionName}(): {(DateTime.Now - startTime).TotalMilliseconds}, per repetition {(DateTime.Now - startTime).TotalMilliseconds/repetitions}")); }
public static HttpResponseMessage Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/azuresearch/performance/blobstorage/serially/repetitions/{repetitions}")] HttpRequestMessage req, int repetitions, ExecutionContext executionContext, TraceWriter log) { List <string> ids = Common.IdsList; DateTime startTime = DateTime.Now; StorageCredentials storageCredentials = new StorageCredentials(CloudConfigurationManager.GetSetting("storageAccountName"), CloudConfigurationManager.GetSetting("storageAccountKey")); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("providers"); List <KyruusDataStructure> providers = new List <KyruusDataStructure>(ids.Count); for (int r = 0; r < repetitions; r++) { foreach (string id in ids) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"p-2018-11-12-15-00-01-000726-Utc-4d41468f-51d7-4c4f-9698-24b6637b7eb5/{id}.json"); string doc = cloudBlockBlob.DownloadText(); KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(doc); providers.Add(p); } } return(req.CreateResponse( HttpStatusCode.OK, $"{repetitions} repetitions in {nameof(BlobStorageSerial)}->{executionContext.FunctionName}(): {(DateTime.Now - startTime).TotalMilliseconds}, per repetition {(DateTime.Now - startTime).TotalMilliseconds/repetitions}")); }
private static async Task GetDocumentsSection(CloudBlobContainer cloudBlobContainer, List <string> ids, int section) { List <KyruusDataStructure> providers = new List <KyruusDataStructure>(5); int start = section * 5; int end = start + 5; for (int i = start; i < end; i++) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"p-2018-11-12-15-00-01-000726-Utc-4d41468f-51d7-4c4f-9698-24b6637b7eb5/{ids[i]}.json"); string doc = await cloudBlockBlob.DownloadTextAsync(); KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(doc); providers.Add(p); } Console.WriteLine($"{providers.Count} providers"); }
public static void GetDocuments(string storageAccountKey, string storageAccountName) { List <string> ids = Common.IdsList; DateTime startTime = DateTime.Now; StorageCredentials storageCredentials = new StorageCredentials(storageAccountName, storageAccountKey); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("providers"); List <KyruusDataStructure> providers = new List <KyruusDataStructure>(ids.Count); foreach (string id in ids) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"p-2018-11-12-15-00-01-000726-Utc-4d41468f-51d7-4c4f-9698-24b6637b7eb5/{id}.json"); string doc = cloudBlockBlob.DownloadText(); KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(doc); providers.Add(p); } Console.WriteLine($"{providers.Count} providers from {nameof(BlobStorage)}->{nameof(GetDocuments)}(): {(DateTime.Now - startTime).TotalMilliseconds}"); }
public static HttpResponseMessage Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/azuresearch/performance/blobstorage/parallel/premium/repetitions/{repetitions}")] HttpRequestMessage req, int repetitions, ExecutionContext executionContext, ILogger log) { List <string> ids = Common.IdsList; DateTime startTime = DateTime.Now; StorageCredentials storageCredentials = new StorageCredentials( Environment.GetEnvironmentVariable("premiumStorageAccountName", EnvironmentVariableTarget.Process), Environment.GetEnvironmentVariable("premiumStorageAccountKey", EnvironmentVariableTarget.Process)); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("providers"); ConcurrentBag <KyruusDataStructure> bag = new ConcurrentBag <KyruusDataStructure>(); List <Task <string> > tasks = new List <Task <string> >(); for (int r = 0; r < repetitions; r++) { foreach (string id in ids) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"ky-2019-04-25-16-00-00-0387-Utc/{id}.json"); // string text = cloudBlockBlob.DownloadTextAsync().Result; tasks.Add(cloudBlockBlob.DownloadTextAsync()); } } Task.WaitAll(tasks.ToArray()); DateTime dt = DateTime.Now; List <KyruusDataStructure> providers = new List <KyruusDataStructure>(); foreach (Task <string> task in tasks) { KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(task.Result); providers.Add(p); } return(req.CreateResponse( HttpStatusCode.OK, $"{repetitions} repetitions in {nameof(BlobStorageParallelPremuim)}->{executionContext.FunctionName}(): {(DateTime.Now - startTime).TotalMilliseconds}, per repetition {(DateTime.Now - startTime).TotalMilliseconds / repetitions}, number of providers returned in total {providers.Count}. Deserialize time {(DateTime.Now - dt).TotalMilliseconds}")); }
public static HttpResponseMessage Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/azuresearch/performance/blobstorage/parallel/premium/repetitions/{repetitions}")] HttpRequestMessage req, int repetitions, ExecutionContext executionContext, TraceWriter log) { List <string> ids = Common.IdsList; DateTime startTime = DateTime.Now; StorageCredentials storageCredentials = new StorageCredentials(CloudConfigurationManager.GetSetting("premiumStorageAccountName"), CloudConfigurationManager.GetSetting("premiumStorageAccountKey")); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(storageCredentials, useHttps: true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference("providers"); ConcurrentBag <KyruusDataStructure> bag = new ConcurrentBag <KyruusDataStructure>(); List <Task> tasks = new List <Task>(); for (int r = 0; r < repetitions; r++) { foreach (string id in ids) { CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($"?/{id}.json"); tasks.Add(Task.Run(() => { string doc = cloudBlockBlob.DownloadText(); KyruusDataStructure p = JsonConvert.DeserializeObject <KyruusDataStructure>(doc); bag.Add(p); })); } } Task.WaitAll(tasks.ToArray()); List <KyruusDataStructure> providers = bag.ToList(); //Accumulate the entries per thread into a single list. return(req.CreateResponse( HttpStatusCode.OK, $"{repetitions} repetitions in {nameof(BlobStorageSerial)}->{executionContext.FunctionName}(): {(DateTime.Now - startTime).TotalMilliseconds}, per repetition {(DateTime.Now - startTime).TotalMilliseconds / repetitions}, number of providers returned in total {providers.Count}")); }
public void GetAllSpecialitiesAliasesAndTypes_Test01() { List <KyruusDataStructure> providers = new List <KyruusDataStructure>(); int index; Alias a1 = new Alias(); Alias a2 = new Alias(); Alias a3 = new Alias(); Alias a4 = new Alias(); Alias a5 = new Alias(); Alias a6 = new Alias(); Alias a7 = new Alias(); Alias a8 = new Alias(); Specialty s1 = new Specialty(); Specialty s2 = new Specialty(); Specialty s3 = new Specialty(); Specialty s4 = new Specialty(); List <Specialty> sList1; List <Specialty> sList2; KyruusDataStructure p1 = new KyruusDataStructure(); KyruusDataStructure p2 = new KyruusDataStructure(); KyruusDataStructure p3 = new KyruusDataStructure(); List <SpecialtyAliasAndType> specialtiesAliasesAndTypes; //Empty provider list. specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(0, specialtiesAliasesAndTypes.Count); //Single provider with null components. providers.Add(p1); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(0, specialtiesAliasesAndTypes.Count); //Single provider with empty specialties collection. p1.specialties = new Specialty[0]; specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(0, specialtiesAliasesAndTypes.Count); //Single provider with single item in specialties collection. Only a specialty. No aliases. s1.aliases = null; s1.specialty = "specialty01"; s1.subspecialty = null; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(1, specialtiesAliasesAndTypes.Count); //One alias index = 0; Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[0].Alias); Assert.AreEqual(null, specialtiesAliasesAndTypes[0].Specialty); Assert.AreEqual(EntryTypes.Specialty, specialtiesAliasesAndTypes[0].EntryType); //Single provider with single item in specialties collection. One specialty with one alias. s1.specialty = "specialty01"; s1.subspecialty = null; a1 = new Alias { name = "a1" }; s1.aliases = new Alias[1] { a1 }; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(1, specialtiesAliasesAndTypes.Count); //One alias index = 0; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); //Single provider with single item in specialties collection. One specialty with no aliases but a subspecialty. s1.specialty = "specialty01"; s1.subspecialty = "subs"; s1.aliases = null; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(1, specialtiesAliasesAndTypes.Count); index = 0; Assert.AreEqual("subs", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); //Single provider with single item in specialties collection. One specialty with two similar aliases and a subspecialty. s1.specialty = "specialty01"; s1.subspecialty = "subs"; a1 = new Alias { name = "a1" }; a2 = new Alias { name = "a1" }; s1.aliases = new Alias[2] { a1, a2 }; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(3, specialtiesAliasesAndTypes.Count); index = 0; Assert.AreEqual("subs", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); //Single provider with single item in specialties collection. One specialty with two dissimilar aliases. s1.specialty = "specialty01"; s1.subspecialty = null; a1 = new Alias { name = "a1" }; a2 = new Alias { name = "a2" }; s1.aliases = new Alias[2] { a1, a2 }; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(2, specialtiesAliasesAndTypes.Count); //Two aliases index = 0; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); //Single provider with single item in specialties collection. One specialty with two dissimilar aliases plus same subspecialty. s1.specialty = "specialty01"; s1.subspecialty = "specialty01"; a1 = new Alias { name = "a1" }; a2 = new Alias { name = "a2" }; s1.aliases = new Alias[2] { a1, a2 }; sList1 = new List <Specialty>() { s1 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(2, specialtiesAliasesAndTypes.Count); //Two aliases index = 0; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); //Single provider with multiple specialties. s1.specialty = "specialty01"; s1.subspecialty = "sub1"; a1 = new Alias { name = "a1" }; a2 = new Alias { name = "a2" }; s1.aliases = new Alias[2] { a1, a2 }; s2.specialty = "specialty02"; s2.subspecialty = "sub2"; a3 = new Alias { name = "a3" }; a4 = new Alias { name = "a4" }; s2.aliases = new Alias[2] { a3, a4 }; sList1 = new List <Specialty>() { s1, s2 }; p1.specialties = sList1.ToArray(); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(6, specialtiesAliasesAndTypes.Count); index = 0; Assert.AreEqual("sub1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("sub2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a3", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a4", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); //Multiple providers with multiple specialties. s1.specialty = "specialty01"; s1.subspecialty = "sub1"; a1 = new Alias { name = "a1" }; a2 = new Alias { name = "a2" }; s1.aliases = new Alias[2] { a1, a2 }; s2.specialty = "specialty02"; s2.subspecialty = "sub2"; a3 = new Alias { name = "a3" }; a4 = new Alias { name = "a4" }; s2.aliases = new Alias[2] { a3, a4 }; sList1 = new List <Specialty>() { s1, s2 }; p1.specialties = sList1.ToArray(); s3.specialty = "specialty03"; s3.subspecialty = "sub3"; a5 = new Alias { name = "a5" }; a6 = new Alias { name = "a6" }; s3.aliases = new Alias[2] { a5, a6 }; s4.specialty = "specialty04"; s4.subspecialty = "sub4"; a7 = new Alias { name = "a7" }; a8 = new Alias { name = "a8" }; s4.aliases = new Alias[2] { a7, a8 }; sList2 = new List <Specialty>() { s3, s4 }; p2 = new KyruusDataStructure(); p2.specialties = sList2.ToArray(); providers.Add(p2); specialtiesAliasesAndTypes = Specialties.AccumulateAllSpecialitiesAliasesAndTypes(providers); Assert.AreEqual(12, specialtiesAliasesAndTypes.Count); index = 0; Assert.AreEqual("sub1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a1", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty01", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("sub2", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a3", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a4", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty02", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("sub3", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty03", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a5", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty03", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a6", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty03", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("sub4", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty04", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Subspecialty, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a7", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty04", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); index++; Assert.AreEqual("a8", specialtiesAliasesAndTypes[index].Alias); Assert.AreEqual("specialty04", specialtiesAliasesAndTypes[index].Specialty); Assert.AreEqual(EntryTypes.Alias, specialtiesAliasesAndTypes[index].EntryType); }
public static List <SpecialtyAliasAndType> AccumulateAllSpecialitiesAliasesAndTypes(List <KyruusDataStructure> providers) { List <SpecialtyAliasAndType> specialtiesAliasesAndTypes = new List <SpecialtyAliasAndType>(); for (int i = 0; i < providers.Count; i++) { KyruusDataStructure p = providers[i]; if (p.specialties == null) { //This provider has no specialties. continue; } foreach (Specialty s in p.specialties) { if (string.IsNullOrWhiteSpace(s.subspecialty) && (s.aliases == null || s.aliases.Length == 0)) { //If the specialty has no aliases and no subspecialty, use specialty as alias/synonym. specialtiesAliasesAndTypes.Add(new SpecialtyAliasAndType { Alias = s.specialty, EntryType = EntryTypes.Specialty, Specialty = null }); continue; } if (string.IsNullOrWhiteSpace(s.subspecialty) == false && s.specialty != s.subspecialty) { //Have a subspecialty that is different from specialty. Treat subspecialty same as alias. if (s.specialty != s.subspecialty) { specialtiesAliasesAndTypes.Add(new SpecialtyAliasAndType { Alias = s.subspecialty, EntryType = EntryTypes.Subspecialty, Specialty = s.specialty }); } } if (s.aliases == null) { return(specialtiesAliasesAndTypes); } foreach (Alias a in s.aliases) { if (s.specialty != a.name) { specialtiesAliasesAndTypes.Add(new SpecialtyAliasAndType { Alias = a.name, EntryType = EntryTypes.Alias, Specialty = s.specialty }); continue; } //Specialty and alias is the same. specialtiesAliasesAndTypes.Add(new SpecialtyAliasAndType { Alias = a.name, EntryType = EntryTypes.Specialty, Specialty = s.specialty }); } } } return(specialtiesAliasesAndTypes); }