2

以下のコードを使用して2つのテーブルからレコードを取得しますが、結果をリストに入れたいと思います。以下のコードを使用しましたが、このエラーが発生しました:

System.Collections.Generic.List<AnonymousType#1>タイプを 暗黙的に変換することはできません System.Collections.Generic.List<QuickRoutes.DAL.Route>

public List<Route> GetAllForUser(Guid userId)
{
    // var result = new List<Route>();
    aspnetdbDataContext aspdb = new aspnetdbDataContext();
    List<Route> result  = (from r in aspdb.Routes
                where r.UserId == userId
                join t in aspdb.TrackPoints on r.RouteId equals t.RouteFK
                select t.TrackPointId,t.RouteFK,t.TrackTime,t.Longitude,t.Latitude,t.Elevation, r.SourceName).ToList();
    return result;
}

編集:

クエリをこのクラスと一致させたい:

namespace QuickRoutes.Entities
{
    public enum RouteType
    {
        Route, Waypoints, Track
    }

    public sealed class Route
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Time { get; set; }
        public List<TrackPoint> TrackPoints { get; set; }
        public Guid UserId { get; set; }
        public string GpxData { get; set; }
        public RouteType RouteType { get; set; }


        public Route(int id)
        {
            Id = id;
            TrackPoints = new List<TrackPoint>();
        }
......

しかし、コードをこれに変更すると、それも機能しません

List<Route> result = (from r in aspdb.RouteLinqs
                                  where r.UserId == userId
                                  join t in aspdb.TrackPointlinqs on r.RouteId equals t.RouteFK
                                  select r).ToList();

正直に言うと、SQLで記述されたこの関数をLINQに変更したいのですが、もっと良いアイデアはありますか?

namespace QuickRoutes.Entities
{
    public enum RouteType
    {
        Route, Waypoints, Track
    }

    public sealed class Route
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Time { get; set; }
        public List<TrackPoint> TrackPoints { get; set; }
        public Guid UserId { get; set; }
        public string GpxData { get; set; }
        public RouteType RouteType { get; set; }


        public Route(int id)
        {
            Id = id;
            TrackPoints = new List<TrackPoint>();
        }
......
4

3 に答える 3

2

これは、投影 (選択しているもの) がRoute(返そうとしているもの) と同じではないためです。

返品をご希望の場合はRoute、選択内容を次のように変更してください:

select r

結合されたプロジェクションを返したい場合は、新しいタイプを作成して、それを返す必要があります。

例えば:

public class RouteTrack
{
    public TrackPointId ...
    public RouteFK ...
    public TrackTime ...
}

メソッドからa を返し、List<RouteTrack>select を次のように変更します。

select new RouteTrack { TrackPointId = t.TrackPointId .... }
于 2012-06-30T14:01:40.063 に答える
1

私は同じに直面しました。ここでの問題は、Route と aspdb.TrackPoints の両方のフィールドを含む匿名型を作成していることです。

したがって、これを List にキャストすることはできません。

これはマッピングの問題です。これを解決するには、クエリから取得するすべてのフィールド/プロパティを含む新しいカスタム クラスを作成する必要があります。

RouteMapper などのカスタム クラスを作成し、次のようなコードを使用してマップするとします。

select new RouterMapper
{
     RouteMapper.TrackPointId = t.TrackPointId, RouteMapper.RouteFK=t.RouteFK,    RouteMapper.SourceName = r.SourceName
}

このようにして、List< RouteMapper> を返します。

于 2012-06-30T13:48:18.293 に答える
1

クエリは 2 つの異なるテーブルからプロパティを選択するため、明らかに type のオブジェクトでRouteはなく、新しいタイプのオブジェクト (匿名型) が返されます。

この新しい型を返したい場合は、明示的に定義してから、この型を使用してデータを返す必要があります。

public class MyClass
{
    public MyClass(int trackPointId, DateTime trackTime, ...)
    {
        TrackPointId = trackPointId;
        TrackTime = trackTime;
        ...
    }


    public int TrackPointId { get; set; }
    public DateTime TrackTime { get; set }
    ...
}

List<MyClass> result  = (from r in aspdb.Routes
              where r.UserId == userId
              join t in aspdb.TrackPoints on r.RouteId equals t.RouteFK
              select new MyClass(t.TrackPointId,t.RouteFK,t.TrackTime,t.Longitude,t.Latitude,t.Elevation, r.SourceName);
于 2012-06-30T14:04:46.380 に答える