LINQ query using StartsWith and Contains to limit the results for an autocomplete field
Naming
Instead of term maybe searchTerm would be better. As in your second example you name the IEnumerable&lt;&gt; variable suppliers, your method would be better named as AutocompleteSuppliers.  

Review  

A Boolean variable can be evaluated just by using the variable, so &amp;&amp; l.IsSupplier == true can be replaced by &amp;&amp; l.IsSupplier. As an evaluation of an boolean is faster as the comparing of an int (assuming AdministrationId  is an int) we change the order of the where condition like  

List&lt;Relation&gt; relations =
    db.Relation
        .Where(l =&gt; l.IsSupplier &amp;&amp;
               l.AdministrationId == Helpers.Session.AdministrationId)  


Inside the foreach loop you are first checking if the Relation.Name is starting with term and if not, you are checking if term is contained inside Relation.Name. This will be faster if term is often the starting of the name, but will be slower if it is contained as of the double check.
So let us just remove the StartsWith().  

Your combination of the Linq statement and the loop does look ok, but will produce different results than in the Autocomplete() method, as you are selecting Relation.Name instead of Relation.Name.ToLowerInvariant().

Refactoring  

As this refactoring is based on the original method we use the Select() with ToLowerInvariant() first and are checking afterwards if it contains the searchTerm  

public ActionResult AutocompleteSuppliers(string searchTerm)
{
    searchTerm = searchTerm.ToLowerInvariant();

    IEnumerable&lt;string&gt; suppliers = db.Relations
        .Where(l =&gt; l.IsSupplier &amp;&amp; l.AdministrationId == Helpers.Session.AdministrationId)
        .Select(l =&gt; l.Name.ToLowerInvariant())
        .Where(s =&gt; s.Contains(searchTerm))
        .OrderBy(s =&gt; s)
        .Take(5);

    return Json(suppliers, JsonRequestBehavior.AllowGet);

}