The error actually gives you a clue. Specifically, it's trying to tell you that the Where statement expects to input an integer (Which you are), and then output a boolean (Which at first glance, it may seem like you are). But in reality, async methods *must* return a Task or Task<T>.
That's what the second part of the error is actually telling you when it says :
An async lambda expression may return void, Task or Task<T>, none of which are convertible to 'Func<int, bool>'.
That's the compiler saying "Hey, I know that you have started an async method here, and I know that an async method can *only* return void, Task or Task<T>, and so I know right away this is not going to work because I'm expecting a plain bool that is not wrapped in a task back".
So how can you get around it?
The simplest way is to simply move your Where statement to a bigger loop. Something like :
var myList = Enumerable.Range(1, 100);
var filteredList = new List<int>();
foreach(var item in myList)
{
if (await CheckId(item))
filteredList.Add(item);
}
Another way is to add the System.Linq.Async package (https://www.nuget.org/packages/System.Linq.Async/). This allows you to do something like :
var myList = Enumerable.Range(1, 100);
var filteredList = myList
.ToAsyncEnumerable()
.WhereAsync(async x => CheckId(x));