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 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

由于您的查询从两个不同的表中选择属性,因此它显然不再返回Routetype 的对象,而是返回一种新的对象类型(匿名类型)。

如果你想返回这个新类型,你需要显式定义它,然后使用这个类型返回数据。

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 回答