Инициализация объекта из одного 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"]) };

... но лично я предпочел бы версию с отдельной переменной для общего выражения.

Другие вопросы по тегам