Skip to content

Instantly share code, notes, and snippets.

@trollsic
Created May 25, 2014 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trollsic/c78eb1bb60aa845f1638 to your computer and use it in GitHub Desktop.
Save trollsic/c78eb1bb60aa845f1638 to your computer and use it in GitHub Desktop.
LinqToQuerystring.Nancy Query Count for MongoDB queries (possible will work with EF queries)
using System.Collections.Generic;
using System.Linq;
using LinqToQuerystring;
namespace LinqToQuerystring.Nancy
{
public static class NancyExtensions
{
public static dynamic LinqToQuerystring<T>(this IQueryable<T> query, IDictionary<string, object> queryDictionary, bool forceDynamicProperties = false, int maxPageSize = -1)
{
var genericType = query.GetType().GetGenericArguments()[0];
bool inlineCount = queryDictionary.ContainsKey("$inlinecount");
if (inlineCount)
{
queryDictionary.Remove("$inlinecount");
}
string queryString = GetFullQueryString(queryDictionary);
object constrainedQuery = query.LinqToQuerystring(genericType, queryString, forceDynamicProperties, maxPageSize);
IQueryable queryable = constrainedQuery as IQueryable;
if (inlineCount)
{
string countQueryString = GetCountQueryString(queryDictionary);
object countQuery = query.LinqToQuerystring(genericType, countQueryString, forceDynamicProperties, maxPageSize);
object results = PackageResults(countQuery as IQueryable<T>, queryable);
return results;
}
return queryable;
}
private static string GetCountQueryString(IDictionary<string, object> queryDictionary)
{
var joined = string.Join("&", queryDictionary
.Where(o => o.Key != "$top" && o.Key != "$skip" && o.Key != "$select")
.Select(o => o.Key + "=" + o.Value));
var queryString = !string.IsNullOrEmpty(joined) ? "?" + joined : string.Empty;
return queryString;
}
private static string GetFullQueryString(IDictionary<string, object> queryDictionary)
{
var joined = string.Join("&", queryDictionary.Select(o => o.Key + "=" + o.Value));
var queryString = !string.IsNullOrEmpty(joined) ? "?" + joined : string.Empty;
return queryString;
}
private static object PackageResults<T>(IQueryable<T> query, IQueryable constrainedQuery)
{
return new Dictionary<string, object> { { "Count", query.Count() }, { "Results", constrainedQuery } };
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment