Лучший способ, на мой взгляд строит пользовательский класс с полями таблицы в качестве членов класса, а затем отправить простой массив с каждой строки в качестве нового экземпляра:
public class Car
{
public string Model { get; set; }
public int Price { get; set; }
}
public void Foo()
{
string strSQL = "Select * From Cars";
List<Car> cars = new List<Car>();
//...initialize connection, Command, etc...
while (reader.Read())
{
cars.Add(new Car {
Model = reader["Model"] + "",
Price = (int)reader["Price"]
});
}
//...send cars.ToArray() over to client...
}
Таким образом, вы посылаете только данные, необходимые , с нулевыми накладными расходами.
Если вы хотите сделать его гибким и поддерживать любую структуру таблицы, вам понадобится еще несколько классов. Самое основное, что я могу думать, это такие классы:
public class BasicField
{
public string Name { get; set; }
public object Value { get; set; }
}
public class BasicRow
{
public BasicField[] Fields { get; set; }
}
public class BasicTable
{
public BasicRow[] Rows { get; set; }
public static BasicTable Parse(DataTable table)
{
string[] fieldNames = table.Columns.OfType<DataColumn>().ToList().ConvertAll(c => c.Caption).ToArray();
List<BasicRow> basicRows = table.Rows.OfType<DataRow>().ToList().ConvertAll(dataRow =>
{
List<BasicField> fields = new List<BasicField>();
for (int i = 0; i < dataRow.ItemArray.Length; i++)
fields.Add(new BasicField
{
Name = fieldNames[i],
Value = dataRow.ItemArray[i]
});
return new BasicRow
{
Fields = fields.ToArray()
};
});
return new BasicTable
{
Rows = basicRows.ToArray()
};
}
}
Затем, чтобы использовать его, требуется такой код:
BasicTable basicTable;
string strSQL = "Select * From Cars";
using (DataTable table = new DataTable())
{
using (SqlDataAdapter adapter = new SqlDataAdapter(strSQL, connection))
{
adapter.Fill(table);
}
basicTable = BasicTable.Parse(table);
}
И вы можете отправить basicTable
к клиенту, сделавшись от минимального примитивных членов, он должен иметь минимальные накладные расходы.
Вы можете использовать BinaryFormatter (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.110).aspx) для сериализации списка или DataTable в двоичном формате. –
Я посмотрю на BinaryFormatter. Но есть ли способ пойти без сериализации? – BendEg
Другим вариантом является просто позволить клиенту выполнять запросы непосредственно против базы данных. –