Linq查询结果到列表集合

问题描述:

我使用下面的代码从两个表中获取记录,但我想要在列表中的结果。我用下面的代码,但这个错误发生: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>(); 
     } 
...... 

这是因为您的投影(您选择的)与Route(您试图返回的内容)不同。

如果你想返回Route更改您的选择:

select r 

如果你想返回你的加入投影,you'l必须创建一个新的类型,并返回:

例如:

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

而且从你的方法返回一个List<RouteTrack>,并改变你的选择:

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

我也面临同样的情况。这里的问题是你正在创建一个包含来自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

由于您的查询从两个不同的表中选择属性,显然它不再返回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);