Возможно, вам повезет больше (и более понятный код), реорганизовав ваше объединение и предложения where. Поймите, с LINQ, вам не всегда нужно иметь предложение where после всех предложений from:
var result =
from u in db.userdetails
join b in db.bids on u.UserID equals b.UserId
where b.DocID == id
join p in db.Products
on b.BidID equals p.BidId
join x in db.Others on b.UserId equals x.UserId into others
from o in others.DefaultIfEmpty()
Select ???
Опять же, если у вас есть правильные ассоциации между вашими сущностями, вы можете избежать всех соединений и просто проецировать в нужную форму, непосредственно перемещаясь по графам объектов.