2

Datatableを返すSQLクエリがあります。

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

次に、routesTableのDatatableオブジェクトを操作できます

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 UserId=@UserId AND RouteId=@RouteId", 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;
        }
4

1 に答える 1

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

これがLINQtoSQLの場合は、さらに単純化できます(ただし、これはLINQ to Entity Frameworkでは機能しません)。

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、子テーブルへの結合に置き換えることができます。つまり、ルートを取得するための1回の呼び出しと、ポイントを取得するための2回目の呼び出しではなく、データベースへの1回の呼び出しでメソッド全体を実行できます。これを行うには、LINQtoSQLでの関連付けと結合について学習する必要があります。

于 2012-07-01T08:58:27.520 に答える