Интересный; это проблема, с которой я сталкивался ранее при использовании IDataReader
, поэтому я теперь религиозно потребляю все таблицы (даже если я ожидаю только одну) - например, если я ожидаю только одну стол, что-то вроде:
while (reader.Read())
{ // read data from first table
}
// read to end of stream
while (reader.NextResult()) { }
Проблема в том, что ошибка входит в TDS в том месте, где вы ее подняли; так что если вы поднимаете его после SELECT
, то в следующей таблице в TDS - и если читатель не читает до конца потока, он может не увидеть его.
Я буду честен - мой предпочтительный ответ на этот вопрос: поднять все ошибки перед данными. Это может означать преобразование основной SELECT
в временную таблицу (#table
) или переменную таблицы (@table
). Кроме того - если критически отловить эту ошибку (и если встроенный код LINQ-to-SQL не помогает), то, возможно, вернитесь к ExecuteReader
и что-то подобное выше.
Я подозреваю (но я не проверял), что вы также можете использовать DataContext.Translate<T>
для выполнения некоторых тяжелых работ ORM; например:
// cmd is our DbCommand, and ctx is our DataContext
using(var reader = cmd.ExecuteReader()) {
var result = ctx.Translate<MyResultType>(reader).ToList();
while(reader.NextResult()) {}
return result;
}