Well, you could move one of the checks up one foreach
:
foreach (var item in MainToSub)
if (item.SubMainID == SearchSubMainID)
foreach (var temp in Main)
if (item.MainID == temp.ID)
Model.Add(temp);
And this isn't really optimization, but you could also turn it into a LINQ expression:
foreach (var temp in MainToSub
.Where(i => i.SubMainID == SearchSubMainID)
.Join(Main, i => i.MainID, t => t.ID, (i, t) => t))
Model.Add(temp);