Already merged, so pedantic at this point, but the original query and your rewrite should generate identical extension method calls behind the scenes. At least according to the spec (C# 3 §7.15.2.5), "degenerate query expressions" (that trivially select the elements of the source) only result in an "extra" step if there's nothing else interesting about the query, and that's only to "ensure that the result of a query expression is never the source object itself".

As generated by dotPeek at e69b6e0c3a11e856a2fbf1d27491a33ec8db242b:

```csharp
return Enumerable.Concat<string>((IEnumerable<string>) new string[1]
  {
    NoteCollection.NormalizeToCanonicalName(this.DefaultNamespace)
  },
  Enumerable.Where<string>(
    Enumerable.Select<Reference, string>(
      (IEnumerable<Reference>) this.repo.Refs,
      (Func<Reference, string>) (reference => reference.CanonicalName)
      ),
    (Func<string, bool>) (refCanonical =>
      {
        if (refCanonical.StartsWith(Reference.NotePrefix, StringComparison.Ordinal))
          return refCanonical != NoteCollection.NormalizeToCanonicalName(this.DefaultNamespace);
        else
          return false;
      })
    )
  );
```

It's also important to note that chains of `Select`, `Where` and other streamed LINQ methods don't result in multiple passes through the sequence, but rather a single pass through effectively nested enumerators.