2010-06-17 30 views
1

我有一個快速linq問題。我有一個應該返回一行數據的存儲過程。我想用lambda來構建一個對象。這是我目前正在做的工作,但我知道我應該能夠使用First而不是Select,除非我似乎無法得到正確的語法。任何人都可以把我拉直嗎?謝謝你的幫助。如何使用linq從1行數據構建對象?

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]; 
       } 

乾杯, 〜CK }

+0

我想通了,我想要的東西而不是ToList()的,我應該使用。首先()這給了我我想要的結果。 var rows = ds.Tables [0] .AsEnumerable(); 位置= rows.Select(C =>新GeoLocationDC { 緯度= Convert.ToInt32(c.Field ( 「緯度」)), 經度= Convert.ToInt32(c.Field ( 「經度」)) } )。第一(); PS我喜歡。任何建議。我以前沒有用過。謝謝! – Hcabnettek 2010-06-17 15:23:51

+0

您實際上並不需要使用「選擇」 - 請確保在關閉問題前閱讀答案。 – 2010-06-17 15:27:07

+1

更好的問題是,如果你只有一行你想創建一個對象,爲什麼要使用LINQ呢?不必要的管道,伊莫。 – Marc 2010-06-17 15:39:01

回答

2

你並不需要使用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"); 
} 
+0

爲什麼要在這一行創建一個類的實例: var location = new GeoLocationDC(); 只在後面的這一行中丟掉它: location = new GeoLocationDC {... }; – 2010-06-17 20:30:12

+0

@Chris Dunaway:只因爲這是OP如何構建代碼。我改變它以反映我將如何寫它。 – 2010-06-17 20:50:15

1

如果你知道你的數據始終是1分的記錄,.Select是罰款。否則,無論如何你都必須做.First().Select()

1

刪除臨時變量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()