I am sharing this solution to sort results by the Module Builder's 'choices' type because it works and may be useful to you. I am interested in feedback and suggestions if you have a better method.
I have built a custom user control to output this dynamic module data that uses OrderBy for the choices field. Here is the relevant code:
// req'd for GetValue()
// This is Module Builder boiler plate code needed to access the custom module:
DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager();
Type jobOpeningType = TypeResolutionService.ResolveType(
// First thing we're doing is making sure that we're not getting any duplicates and only getting published items.
var jobs = dynamicModuleManager.GetDataItems(jobOpeningType).Where(i => i.Status == ContentLifecycleStatus.Live && i.Visible ==
// This foreach loops over all published jobs and sorts them by "Category" - our choices column.
// Sorting a dropdown in a custom module is awkward.
// "Category" (the choice column) must be resolved before it can be sorted.
// To resolve it, you must use Sitefinity's GetValue(), which returns a String (of choices).
// Then you need to grab the first string in the array with the appropriate casts and methods.
// This works because we only allow 1 choice to be selected.
jobs.OrderBy(j => (
// job is now filtered for currently published and is sorted by the choices column
// YOU MAY DO SOMETHING WITH job HERE
// If you need the string value of "Category" (the choice) as string,
// you will need to repeat the process above:
Category = (
I don't like ordering so late on looped output, but I had trouble with it working on retrieval.
This might be simplified if there was an extension method that resolved the 1st item in the choices string array. It could be named something like .GetFirstValue('choices_column').