Вопрос Linq Take()
Я хочу отфильтровать мои результаты, чтобы взять только X количество записей. Мне интересно, как работает Take()?
На этом сайте я нашел: http://www.hookedonlinq.com/TakeOperator.ashx
Он говорит, что Take() "Выбрасывает ArgumentNullException, если источник имеет значение null". И что же мне делать? Я не могу гарантировать, что каждый раз, когда я делаю Take(), у меня будет несколько записей в этой таблице или нет.
Так что мне сначала нужно сделать подсчет? Затем выполните другой запрос, чтобы убедиться, что есть некоторые записи для захвата?
Также, что произойдет, если у меня есть Take (2), но только одна запись будет ли это же исключение?
Ответы
Ответ 1
Есть разница между пустой ссылкой и пустой коллекцией. Это нормально, чтобы позвонить. Возьмите пустую коллекцию. И аргумент указывает максимальное число, которое нужно взять, поэтому также можно указать больше, чем есть элементы в коллекции.
Я рекомендую обратиться к MSDN для получения более точных сведений.
Для Linq для объектов: http://msdn.microsoft.com/en-us/library/bb503062.aspx
Для ссылки на базы данных: http://msdn.microsoft.com/en-us/library/bb300906.aspx
Ответ 2
Это исключение нулевой ссылки - только если вы делаете это против источника объекта, например:
List<MyObject> myList = null;
myList.Take(5); // this would produce the error, of course
Когда вы выполняете Linq to SQL, он возвращает EMPTY-перечислитель ваших данных, а не пустую ссылку. Точно так же, если вы пытаетесь взять больше, чем доступно, он будет использовать только доступную сумму. Я использую этот метод для отображения данных в некоторых случаях и, безусловно, много времени, когда я буду запрашивать больше записей, чем список доступен.
Ответ 3
Возьмите вызов через исключение, если объект, вызывающий его, равен нулю. Скорее всего, у вас не будет нулевого объекта, а наличие строк или строк будет не одинаковым (я уверен, что вы понимаете семантику).
Если вы используете контекст Linq to SQL и запрашиваете
Context.MyTable.Where(x => x.ID > 0).Take(2);
в случае возвращения Where
нулевых результатов вы не получите нулевое исключение, потому что ваш запрос еще не выполнен, тогда в случае, если он содержит только 1 результат, вы получите только 1 результат назад. Take
ограничивает количество возвращаемых записей.
Ответ 4
Подсчитайте количество элементов до Take():
List<string> a = new List<string>();
int count = a.Count > 12 ? 12 : a.Count;
a.Take(count);