Your if statement and query doesn't make much sense. You are saying 'if any of these are not null' ... but what if say FirstName is provided but all the rest are null? Your query would still try to include the null values in the where clause.
You can break down your where into multiple steps, like so...
var query = (from i in dbContext.User_details
join j in dbContext.User_addresses on i.Userid equals j.Userid
join k in dbContext.Userworkdetails on j.Userid equals k.Userid
join l in dbContext.Useredudetails on k.Userid equals l.Userid
if (!string.IsNullOrEmpty(FirstName))
query = query.Where(u => u.FirstName == FirstName);
if (!string.IsNullOrEmpty(LastName))
query = query.Where(u => u.LastName == LastName);
var results = from r in query.ToList()
select new
{
Id = i.Userid,
city = j.City,
Firstname = i.Firstname,
company = k.Company,
college = l.College,
state = j.State,
lastname = i.Lastname
}).ToArray();
This way, only the values that are actually provided are used to filter the results. Alternatively, you could create a number of Overloads for each of the possible values, rather than passing null values.
Personally, I'd create a 'SearchCriteria' object that I pass in to the function, e.g.
public JsonResult Details(SearchCriteria criteria)
Your criteria object will have all of the possible values that you can search by.