Just found Nhibernate Linq limitation.
It can't translate toLower() on string but luckily, it has compare in case sensitive.
it throws weird error if you use this.
q = q.Where(c => c.firstName.Contains(flter) || c.lastName.Contains(flter) || c.email.Contains(flter));
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index