Я пытаюсь импортировать файл в базу данных и учиться более эффективному способу выполнения задач. В этой статье предлагается, чтобы цепочки перечислений приводили к низкому использованию памяти и хорошей производительности.
Это мой первый раз цепочка нескольких перечислений, и я не совсем уверен, как правильно обработать сброс ...
Рассказ:
У меня есть перечисление, которое читает из текстового файла и сопоставляет с DTO (см. Функцию Map), перечислитель Where, за которым следует Import, который принимает перечисление ... Все работает отлично, за исключением того, что, когда фильтр возвращает 0 записей ... В этом случае ошибки SQL, говорящие System.ArgumentException: There are no records in the SqlDataRecord enumeration.
...
Итак, я поставил if(!list.Any()) return;
в верхней части моего метода импорта, и, похоже, это не ошибка. За исключением того, что он всегда будет пропускать все строки до (и включая) первую действительную строку в текстовом файле ...
Нужно ли как-то сбрасывать () перечислитель после моего вызова Any ()? Почему это не нужно, если одна и та же структура используется в Linq и других реализациях Enumerable?
Код:
public IEnumerable<DTO> Map(TextReader sr)
{
while (null != (line = sr.ReadLine()))
{
var dto = new DTO();
var row = line.Split('\t');
// ... mapping logic goes here ...
yield return (T)obj;
}
}
//Filter, called elsewhere
list.Where(x => Valid(x)).Select(x => LoadSqlRecord(x))
public void Import(IEnumerable<SqlDataRecord> list)
{
using (var conn = new SqlConnection(...))
{
if (conn.State != ConnectionState.Open)
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "Import_Data";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
var parm = new SqlParameter();
cmd.Parameters.Add(parm);
parm.ParameterName = "Data"
parm.TypeName = "udt_DTO";
parm.SqlDbType = SqlDbType.Structured;
parm.Value = list;
cmd.ExecuteNonQuery();
conn.Close();
}
}
Извините за длинный пример. Спасибо за чтение ...