Метод GetBytes
IDataReader
на самом деле не предоставляет никаких опций для написания кода более функциональным способом (он требует массив, который он хочет изменить, поэтому мы просто должны дать ему некоторый массив ..) .).
Таким образом, ваша версия кода в порядке - даже если она не полностью функциональна, вы можете, по крайней мере, сохранить императивную часть локализованной в этой единственной функции и сохранить функциональность остальной части вашей программы (что является хорошим результатом)!
Единственное изменение, которое я бы сделал в вашем коде, это то, что я переместил бы reader
к пониманию последовательности (чтобы сделать его более локализованным), и я бы использовал ключевое слово use
, чтобы убедиться, что оно правильно расположено (также вам не нужен идентификатор List
в выражении последовательности):
let retVal =
[ use reader = selectCommand.ExecuteReader()
while reader.Read() do
yield (reader.GetString(0), getBytesData reader, reader.GetDateTime(2)) ]