Как получить обнуляемый int[] с помощью dapper?

Если я хочу получить кучу строк, содержащих один столбец int, используя Dapper, и этот набор результатов может быть пустым. Как лучше всего использовать 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

person scottm    schedule 25.05.2012    source источник
comment
Что за исключение? Трассировки стека?   -  person Paul Phillips    schedule 26.05.2012
comment
Ни один из примеров не является компилируемым кодом. Не могли бы вы позаботиться о том, чтобы оба были именно теми, что вы пробовали? (x => v.Value содержит опечатку, а .Query<int> в сочетании с x.HasValue тоже недопустимо.) Насколько актуальна ваша версия Dapper?   -  person Kirk Woll    schedule 26.05.2012
comment
@KirkWoll только что обновил Dapper сегодня, чтобы убедиться, что это не проблема версии.   -  person scottm    schedule 26.05.2012
comment
Я только что обновил свою версию Dapper и (до сих пор) не могу воспроизвести проблему.   -  person Kirk Woll    schedule 26.05.2012
comment
@KirkWoll Я повторил попытку с моим примером, и он не приводит к такому поведению. У меня есть несколько объединений в моем фактическом запросе, и я пытаюсь воспроизвести пример запроса.   -  person scottm    schedule 26.05.2012


Ответы (2)


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

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

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

person Servy    schedule 25.05.2012
comment
Да, вот в чем проблема. Если вместо этого я сделаю аргумент универсального типа int?, я смогу отфильтровать те, которые не имеют значения (а это все). - person scottm; 26.05.2012
comment
Если фактический запрос возвращает значения, равные null, вам нужен код, похожий на ваш первый фрагмент. Что с этим не так? Зачем менять? - person Servy; 26.05.2012
comment
Возвращается 0 строк, а не строка с null. Если я изменю аргумент на int?, я получу IEnumerable<int?> с .Count() == 1, а object будет null. - person scottm; 26.05.2012
comment
@scottm Тогда это плохое решение со стороны провайдера; он действительно должен просто возвращать пустое перечисляемое. Поскольку он возвращает элемент с нулевым значением, у вас нет другого выбора, кроме как использовать ваш первый подход. - person Servy; 26.05.2012

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

person scottm    schedule 29.05.2012