I'd recommend building your query in several steps. This way you can take the conditions to outside the query which makes it cleaner and also gives you more control. Something like this:
var pers = from p in db.Table<Persons>()
select p;
if(OPerson.Id !=null)
pers = pers.Where(p => p.Id==OPerson.Id);
if(OPerson.Name !=null)
pers = pers.Where(p => p.Name.Contains(OPerson.Name);
....
....
var results = pers.ToList();
This code still generates one single query that is only executed once when you call the ToList()
method.