2012-07-01 24 views
2

,而不是使用DataTable的我有一個返回DataTable的SQL查詢:什麼可以在LINQ

var routesTable = _dbhelper.Select("SELECT [RouteId],[UserId],[SourceName],[CreationTime] FROM [Routes] WHERE [email protected] AND [email protected]", inputParams); 

然後我們就可以用DataTable對象工作routesTable

if (routesTable.Rows.Count == 1) 
      { 
       result = new Route(routeId) 
       { 
        Name = (string)routesTable.Rows[0]["SourceName"], 
        Time = routesTable.Rows[0]["CreationTime"] is DBNull ? new DateTime() : Convert.ToDateTime(routesTable.Rows[0]["CreationTime"]) 
       }; 

       result.TrackPoints = GetTrackPointsForRoute(routeId); 
      } 

我想將此代碼更改爲LINQ,但我不知道如何在LINQ中模擬Datatable,我寫了這部分:

Route result = null; 
      aspnetdbDataContext aspdb = new aspnetdbDataContext(); 
      var Result = from r in aspdb.RouteLinqs 
          where r.UserId == userId && r.RouteId==routeId 
          select r; 


    .... 

,但我不知道我怎樣才能改變這種部分:

if (routesTable.Rows.Count == 1) 
      { 
       result = new Route(routeId) 
       { 
        Name = (string)routesTable.Rows[0]["SourceName"], 
        Time = routesTable.Rows[0]["CreationTime"] is DBNull ? new DateTime() : Convert.ToDateTime(routesTable.Rows[0]["CreationTime"]) 
       }; 

請你告訴我,我該怎麼辦呢?

編輯 在這裏你可以看到整個代碼塊原

public Route GetById(int routeId, Guid userId) 
     { 
      Route result = null; 
      var inputParams = new Dictionary<string, object> 
            { 
             {"UserId", userId}, 
             {"RouteId", routeId} 
            }; 

      var routesTable = _dbhelper.Select("SELECT [RouteId],[UserId],[SourceName],[CreationTime] FROM [Routes] WHERE [email protected] AND [email protected]", inputParams); 

      if (routesTable.Rows.Count == 1) 
      { 
       result = new Route(routeId) 
       { 
        Name = (string)routesTable.Rows[0]["SourceName"], 
        Time = routesTable.Rows[0]["CreationTime"] is DBNull ? new DateTime() : Convert.ToDateTime(routesTable.Rows[0]["CreationTime"]) 
       }; 

       result.TrackPoints = GetTrackPointsForRoute(routeId); 
      } 

      return result; 
     } 

SELECT功能:

public DataTable Select(string query, Dictionary<string, object> parameters) 
     { 
      var dt = new DataTable(); 

      using (_command = new SqlCommand(query, _connnection)) 
      { 
       InitializeParametersAndConnection(parameters); 

       using (_adapter = new SqlDataAdapter(_command)) 
       { 
        _adapter.Fill(dt); 
       } 
      } 

      return dt; 
     } 

和GetTrackPointsForRoute

private List<TrackPoint> GetTrackPointsForRoute(int routeId) 
     { 
      aspnetdbDataContext aspdb = new aspnetdbDataContext(); 
      var result = new List<TrackPoint>(); 
      var trackPointsTable = from t in aspdb.TrackPointlinqs 
            where t.RouteFK == routeId 
            select t; 
      foreach (var trackPointRow in trackPointsTable) 
      { 
       var trackPoint = new TrackPoint 
       { 
        Id = (int)trackPointRow.TrackPointId, 
        Elevation = Convert.ToSingle(trackPointRow.Elevation), 
        Latitude = Convert.ToDouble(trackPointRow.Latitude), 
        Longitude = Convert.ToDouble(trackPointRow.Longitude), 
        Time = trackPointRow.TrackTime is DBNull ? new DateTime() : (DateTime)trackPointRow.TrackTime 
       }; 
       result.Add(trackPoint); 
      } 

      return result; 
     } 
+0

你怎麼知道你的原始代碼是一個明智的方法來解決這個問題呢?你想達到什麼目的? –

+0

另外'var Result ='具有誤導性,因爲該行不會構造結果。它構造一個查詢。另外,使用僅在大小寫不同的情況下使用兩個變量是不好的做法('result'和'Result')。 –

+0

我想將我的代碼更改爲LINQ,我也編輯了我的文章 – Kabi

回答

3
var firstRoute = aspdb.RouteLinqs 
    .Where(r => r.UserId == userId && r.RouteId == routeId) 
    .FirstOrDefault(); 

if (firstRoute == null) 
{ 
    return null; 
} 
else 
{ 
    return new Route(routeId) 
    { 
     Name = first.SourceName, 
     Time = first.CreationTime ?? new DateTime(), 
     TrackPoints = GetTrackPointsForRoute(routeId) 
    }; 
} 

如果是這樣的LINQ to SQL可以進一步簡化它(這不會使用LINQ的工作,雖然實體框架):

return aspdb.RouteLinqs 
    .Where(r => r.UserId == userId && r.RouteId == routeId) 
    .Select(r => new Route(routeId) 
    { 
     Name = r.SourceName, 
     Time = r.CreationTime ?? new DateTime(), 
     TrackPoints = GetTrackPointsForRoute(routeId) 
    }) 
    .FirstOrDefault(); 

注意:你也許可以用加入到子表代替GetTrackPointsForRoute,意整個方法可以通過對數據庫的單個調用來完成,而不是一次調用來獲取路由,第二次調用來獲得點。爲此,您應該瞭解LINQ to SQL中的關聯和連接。

+0

嗨馬克,THNK你,我想你回答了我,但我想更清楚我的情況:這塊代碼返回一個路線和計算這條路線(我與GPX工作)的一些東西也編輯我的文章 – Kabi