Как я могу использовать linq для создания объекта из 1 строки данных?

У меня есть быстрый вопрос linq. У меня есть хранимая процедура, которая должна возвращать одну строку данных. Я хотел бы использовать лямбду для создания объекта. Вот что я сейчас делаю, и это работает, но я знаю, что должен использовать First вместо Select, за исключением того, что я не могу правильно понять синтаксис. Может ли кто-нибудь выпрямить меня здесь? Спасибо за любую помощь.

 var location = new GeoLocationDC();
 DataSet ds = db.ExecuteDataSet(dbCommand);
 if(ds.Tables[0].Rows.Count == 1)
            {
                 var rows = ds.Tables[0].AsEnumerable();
                 var x = rows.Select(
                     c => new GeoLocationDC
                              {
                                  Latitude = Convert.ToInt32(c.Field<string>("LATITUDE")),
                                  Longitude = Convert.ToInt32(c.Field<string>("LONGITUDE"))
                              }).ToList();
                 if(x.Count > 0 )
                 {
                     location = x[0];
                 }

Привет, ~ ск }


person Hcabnettek    schedule 17.06.2010    source источник
comment
Я понял, что я хотел. Вместо ToList() я должен был использовать .First(). Это дало мне желаемый результат. var rows = ds.Tables[0].AsEnumerable(); location = rows.Select(c =› new GeoLocationDC { Latitude = Convert.ToInt32(c.Field‹string›(ШИРОТА)), Longitude = Convert.ToInt32(c.Field‹string›(LONGITUDE)) }).First( ); PS Мне нравится .Любое предложение. Я не использовал это раньше. Спасибо!   -  person Hcabnettek    schedule 17.06.2010
comment
На самом деле вам не нужно использовать Select - обязательно прочитайте ответы, прежде чем закрывать вопрос.   -  person Bryan Watts    schedule 17.06.2010
comment
Лучше задать вопрос: если у вас есть только одна строка, из которой вы хотите создать объект, зачем вообще использовать LINQ? Ненужная сантехника, имхо.   -  person Marc    schedule 17.06.2010
comment
Хороший вопрос, Марк. Я выбрал решение Брайана ниже.   -  person Hcabnettek    schedule 17.06.2010


Ответы (3)


Вам не нужно использовать Select - поскольку вы знаете, что есть ровно 1 строка, вы можете использовать ее напрямую:

var location = new GeoLocationDC();
var ds = db.ExecuteDataSet(dbCommand);

if(ds.Tables[0].Rows.Count == 1)
{
    var row = ds.Tables[0].AsEnumerable().Single();

    location.Latitude = row.Field<int>("LATITUDE");
    location.Longitude = row.Field<int>("LONGITUDE");
}
person Bryan Watts    schedule 17.06.2010
comment
Зачем создавать экземпляр класса в этой строке: var location = new GeoLocationDC(); только для того, чтобы выбросить его позже в этой строке: location = new GeoLocationDC {... }; - person Chris Dunaway; 18.06.2010
comment
@Chris Dunaway: Только потому, что именно так ОП структурировал код. Я изменил его, чтобы отразить то, как я буду его писать. - person Bryan Watts; 18.06.2010

Если вы знаете, что ваши данные всегда представляют собой 1 запись, .Select подойдет. В противном случае вам все равно придется делать .First().Select().

person Codesleuth    schedule 17.06.2010

Отбросив временную переменную x и необходимость проверки количества, вы можете сделать так:

var location = rows.Select(c => new GeoLocationDC
    {
        Latitude = Convert.ToInt32(c.Field<string>("LATITUDE")),
        Longitude = Convert.ToInt32(c.Field<string>("LONGITUDE"))
    }).First(); //or better yet, use FirstOrDefault()

(

person Kevin Le - Khnle    schedule 17.06.2010