Name | Value | Type | |
---|---|---|---|
▶ | InnerException | {"A recognition error occurred."} | System.Exception {Antlr.Runtime.NoViableAltException} |
public ActionResult UrlDatasource([FromBody]DataManagerRequest dm)
{
using (ISession session = NHibertnateSession.OpenSession())
{
var employees = session.Query<Employee>().ToList();
IEnumerable DataSource = employees;
DataOperations operation = new DataOperations();
if (dm.Where != null && dm.Where.Count > 0) //Filtering
{
DataSource = operation.PerformFiltering(DataSource, dm.Where, dm.Where[0].Operator);
}
int count = DataSource.Cast<Employee>().Count();
if (dm.Skip != 0)
{
DataSource = operation.PerformSkip(DataSource, dm.Skip); //Paging
}
if (dm.Take != 0)
{
DataSource = operation.PerformTake(DataSource, dm.Take);
}
return dm.RequiresCounts ? Json(new { result = DataSource, count = count }) : Json(DataSource);
}
} |
private ICriteria ToQuery(DataManagerRequest dm, ISession session) {
ICriteria criteria = session.CreateCriteria<EmployeeMap>();
Count = session.CreateCriteria<EmployeeMap>().List().Count;
Order order = null;
if (dm.Where != null && dm.Where.Count > 0) //Filtering
{
for (var i = 0; i < dm.Where.Count; i++) {
WhereFilter filter = dm.Where[i];
if (filter.IsComplex)
WhereFilter(criteria, filter); //Handle multiple column filter – REFER BELOW SAMPLE FOR CODE
if (filter.Operator == "equal")
criteria.Add(Restrictions.Eq(filter.Field, filter.value));
if (filter.Operator == "notequal")
criteria.Add(Restrictions.Not(Restrictions.Eq(filter.Field, filter.value)));
if (filter.Operator == "greaterthan")
criteria.Add(Restrictions.Ge(filter.Field, filter.value));
if (filter.Operator == "lessthan")
criteria.Add(Restrictions.Lt(filter.Field, filter.value));
if (filter.Operator == "greaterthanorequal")
criteria.Add(Restrictions.Ge(filter.Field, filter.value));
if (filter.Operator == "lessthanorequal")
criteria.Add(Restrictions.Le(filter.Field, filter.value));
if (filter.Operator == "startswith")
criteria.Add(Restrictions.Like(filter.Field, filter.value + "%"));
if (filter.Operator == "endswith")
criteria.Add(Restrictions.Like(filter.Field, "%" + filter.value));
if (filter.Operator == "contains")
criteria.Add(Restrictions.Like(filter.Field, filter.value.ToString(), MatchMode.Anywhere));
Count = criteria.List().Count; //Required to show filter count
}
}
if (dm.Sorted != null && dm.Sorted.Count > 0) //Sorting
{
for (var i = 0; i < dm.Sorted.Count; i++) {
order = dm.Sorted[i].Direction == "ascending" ? Order.Asc(dm.Sorted[i].Name) :Order.Desc(dm.Sorted[i].Name);
criteria.AddOrder(order);
}
}
if (dm.Skip != 0) //Paging
{
criteria.SetFirstResult(dm.Skip);
}
if (dm.Take != 0) //Paging
{
criteria.SetMaxResults(dm.Take);
}
return criteria; } |
//PROVIDE GRID DATASOURCE
public ActionResult GetData(DataManagerRequest dm)
{
using (ISession session = AppSession.OpenSession())
{
list = ToQuery(dm,session).List<EmployeeMap>();
}
return Json(new { result = list, count = Count }, JsonRequestBehavior.AllowGet); } |
Was there ever a different solution to this problem? As David points out the difference in the NHibernate and EF queries is usually trivial. It seems the main problem is combining pieces of criteria that is the problem for me. Individual pieces of criteria seem to work fine. So if I just filter by 1 column it works but as soon as I filter by 2 columns it doesn't work. It seems like the problem could be fairly simple to me.
This issue has been fixed in version v19.1.0.67 of Syncfusion.EJ2.AspNet.Core