2012-06-30 162 views
1

我使用下面的代碼從兩個表中獲取記錄,但我想要在列表中的結果。我用下面的代碼,但這個錯誤發生:Linq查詢結果到列表集合

無法隱式轉換類型 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>(); 
     } 
...... 

回答

2

這是因爲您的投影(您選擇的)與Route(您試圖返回的內容)不同。

如果你想返回Route更改您的選擇:

select r 

如果你想返回你的加入投影,you'l必須創建一個新的類型,並返回:

例如:

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

而且從你的方法返回一個List<RouteTrack>,並改變你的選擇:

select new RouteTrack { TrackPointId = t.TrackPointId .... } 
1

我也面臨同樣的情況。這裏的問題是你正在創建一個包含來自Route和aspdb.TrackPoints的字段的匿名類型。

因此,您不能將其轉換爲List。

這是一個映射問題。 要解決此問題,您需要創建一個新的自定義類,其中包含您從查詢中獲取的所有字段/屬性。

比方說,你創建一個自定義類說RouteMapper然後映射使用如下代碼

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

這樣,現在你返回列表< RouteMapper>。

+0

我編輯可以張貼 – Kabi

+0

無法理解你想要的這裏......你要填單子和使用LINQ查詢路由實體??? – Dinesh

1

由於您的查詢從兩個不同的表中選擇屬性,顯然它不再返回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);