(from p in StaticVa.new_data_context.Categories
where p.CategoryName == Category_Name
select p.CategoryID)
представляет выражение, которое при выполнении возвращает набор элементов.
, поэтому вы говорите:
var catIds = (from p in StaticVa.new_data_context.Categories
where p.CategoryName == Category_Name
select p.CategoryID);
, затем вы получаете первое (т.е.принудительно выполнить приведенное выше выражение и начать возвращать значения):
int? Category_ID = catIds.FirstOrDefault();
вам нужен int?
в случае, если не возвращена первая строка, и в этом случае FirstOrDefault()
вернет ноль.
Однако, если вы уверены, что он вернет по крайней мере одну строку , тогда вы можете сказать
int Category_ID = catIds.First();
И если вы уверены, что он вернет только одну строку тогда вы можете сказать
int Category_ID = catIds.Single();