That would work if you used i => instead of i = . You can put it all in one block however, like follows:
query = from i in _db.ILV
join p in _db.PC on
i.PostCode equals p.PostCode
where (!string.IsNullOrEmpty(key)) ? i.Description.Contains (key) : true &&
(!string.IsNullOrEmpty(rng)) ? // rest of your where clauses follow the same pattern
select i;