Инициализация объекта из одного DataRow
Чтобы заполнить List из DataTable, я обычно пишу следующее утверждение:
List<Foo> foos = dt.AsEnumerable().Select(dr =>
new Foo { Bar = Convert.ToIn32(dr["Bar"]),
Baz = Convert.ToDecimal(dr["Baz"]) }).ToList();
Как я могу написать аналогичное утверждение для инициализации одного объекта, когда я знаю, что DataTable вернет только 1 строку, как в следующем псевдокоде:
Foo foo = dt.Rows[0].Select(dr =>
new Foo { Bar = Convert.ToIn32(dr["Bar"]),
Baz = Convert.ToDecimal(dr["Baz"]) });
Я хотел бы написать только одно утверждение и хочу избежать (если возможно) 2 строки, подобные этой:
DataRow dr = dt.Rows[0];
Foo foo = new Foo { Bar = Convert.ToIn32(dr["Bar"]),
Baz = Convert.ToDecimal(dr["Baz"]) });
Я пробовал комбинации Where
, Select
, First
, Single
но не может ударить гвоздь по голове!
Любые ответы, как всегда, приветствуются.
2 ответа
Решение
Foo foo = dt.AsEnumerable().Select(dr =>
new Foo { Bar = Convert.ToIn32(dr["Bar"]),
Baz = Convert.ToDecimal(dr["Baz"]) }).Single();
Ну, вы можете сделать:
Foo foo = new Foo { Bar = Convert.ToIn32(dt.Rows[0]["Bar"]),
Baz = Convert.ToDecimal(dt.Rows[0]["Baz"]) };
... но лично я предпочел бы версию с отдельной переменной для общего выражения.