2010-06-17 37 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()