Skip to content

Instantly share code, notes, and snippets.

@JamesKyburz
Last active December 13, 2015 23:59
Show Gist options
  • Save JamesKyburz/4995841 to your computer and use it in GitHub Desktop.
Save JamesKyburz/4995841 to your computer and use it in GitHub Desktop.
Ad hoc Simple.Data queries
[HttpGet]
public virtual ActionResult Query()
{
var result = entity.All();
var q = Request.QueryString;
if (null != q["select"])
{
var selection = q["select"].Split(',').Select(col => entity[col] as SimpleReference).ToArray();
result = result.Select(selection);
}
dynamic filter = null;
var operations = new Dictionary<string, Func<dynamic, dynamic, dynamic>>() {
{"isset", (x, y) => x != null },
{"isnotset", (x, y) => x == null },
{"equals", (x, y) => x == y },
{"notequals", (x, y) => x != y },
{"lessthan", (x, y) => x < y },
{"lessthanorequal", (x, y) => x <= y },
{"greaterthan", (x, y) => x > y },
{"greaterthanorequal", (x, y) => x >= y },
{"like", (x, y) => x.Like(y) },
};
Action<dynamic> addFilter = (match) => {
if (null == filter)
filter = match;
else
filter = filter && match;
};
operations.Keys.ForEach(key => {
var givenFilter = q[key];
if (null != givenFilter)
givenFilter.Split(',').ForEach(pair => {
var values = pair.Split('=');
var value = values.Length == 2 ? values[1] : null;
addFilter(operations[key](entity[values[0]], value));
});
});
if (null != filter) result = result.Where(filter);
if (null != q["orderBy"]) result = result.OrderBy(entity[q["orderBy"]]);
if (null != q["orderByDescending"]) result = result.OrderByDescending(entity[q["orderByDescending"]]);
if (null != q["skip"]) result = result.Skip(int.Parse(q["skip"]));
if (null != q["take"]) result = result.Take(int.Parse(q["take"]));
if (null != q["with"]) result = result.With(q["with"]);
return Json(result, JsonRequestBehavior.AllowGet);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment