2012-05-25 3 views
3

Если я хочу получить кучу строк, содержащих один столбец int, используя Dapper, и этот набор результатов может быть пустым. Каков наилучший способ использовать Dapper для запроса этих данных?Как получить nullable int [] с dapper?

Для примера, если у меня есть следующий метод, который возвращает то, что я хочу:

public void int[] GetInts() 
{ 

    conn.Query<int?>("select 123 where 1=1") 
     .Where(x=> x.HasValue) 
     .Select(x => x.Value) 
     .ToArray(); 
} 

Если я изменить строку на это:

conn.Query<int>("select 123 where 1=0").ToArray(); 

я получаю ошибку произнесения при наличии нет Результаты.

трассировки стека ниже и исключение составляет только ссылка на объект не установлено на экземпляр объекта при заливке (T)next:

at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in .\SqlMapper.cs:line 611 
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)  
    at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in .\SqlMapper.cs:line 539 
+0

В чем исключение? Трассировки стека? –

+1

Ни один из примеров не является компилируемым кодом. Не могли бы вы позаботиться о том, чтобы убедиться, что вы точно это сделали? ('x => v.Value' имеет опечатку и' .Query 'в сочетании с' x.HasValue' тоже не является законным.) И насколько актуальна ваша версия Dapper? –

+0

@KirkWoll только что обновил Dapper сегодня, чтобы убедиться, что это не проблема с версией. – scottm

ответ

0

Моя проблема оказалась в том, что я делал код LEFT JOIN, но пока я пытался воспроизвести ошибку, я использовал INNER JOIN, поэтому я не мог воспроизвести такое же поведение. С LEFT JOIN была возвращена одна строка со значением NULL, поэтому я получал ошибку литья между NULL и int.

0

Ну, Where и Select не имеет никакого смысла, если это внутр. Довольно уверены, что вы хотите удалить их.

conn.Query<int>("select 123 where 1=0") 
    .ToArray(); 

У вас возникли проблемы, когда вы это делаете?

+0

Да, это проблема. Если я сделаю аргумент generic type «int?» Вместо этого, я могу отфильтровать те, у которых нет значения (что все они). – scottm

+0

Если запрос действительно возвращает значения, которые являются «нулями», тогда вам нужно иметь код, похожий на ваш первый фрагмент. Что с этим не так? Зачем это менять? – Servy

+0

Возвращаются 0 строк, а не строка с 'null'. Если я изменю аргумент на 'int?', Я получаю 'IEnumerable ' с '.Count() == 1', а' object' - 'null'. – scottm

Смежные вопросы