Really minor improvement, but in order to remove that extra if (numStillWanted > 0) we could consider any alcohol that we don’t have as inventory that belongs to no one.
To make this work in the code, we just add a line outside the outer loop:
have = have.concat(wanted.select(cur => new AlcoholInventoryItem(null, cur.Name, cur.Quantity));
With this, we’re assured that we will never be left with numStillWanted > 0 after the inner loop because in the case where no one has any of the alcohol we want, our inventory consists of alcohol that belongs to no one that has exactly the quantity we want.