Подтвердить что ты не робот

Вопрос Linq Take()

Я хочу отфильтровать мои результаты, чтобы взять только X количество записей. Мне интересно, как работает Take()?

На этом сайте я нашел: http://www.hookedonlinq.com/TakeOperator.ashx

Он говорит, что Take() "Выбрасывает ArgumentNullException, если источник имеет значение null". И что же мне делать? Я не могу гарантировать, что каждый раз, когда я делаю Take(), у меня будет несколько записей в этой таблице или нет.

Так что мне сначала нужно сделать подсчет? Затем выполните другой запрос, чтобы убедиться, что есть некоторые записи для захвата?

Также, что произойдет, если у меня есть Take (2), но только одна запись будет ли это же исключение?

4b9b3361

Ответ 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);