Linq查询结果到List集合

时间:2012-06-30 13:39:08

标签: c# linq

我使用下面的代码从两个表中获取记录,但我希望将结果放在List中。我使用下面的代码,但发生了这个错误:

  

无法隐式转换类型   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>();
        }
......

3 个答案:

答案 0 :(得分:2)

这是因为您的预测(您选择的内容)与Route(您要返回的内容)不同;

如果您希望返回Route,请将您的选择更改为:

select r

如果您希望返回已加入的投影,则必须创建一个新类型,然后返回:

e.g:

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

从您的方法返回List<RouteTrack>,并将您的选择更改为:

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

答案 1 :(得分:1)

我也面临同样的问题。这里的问题是您正在创建一个包含Route和aspdb.TrackPoints字段的匿名类型。

因此你无法将其转换为List。

这是一个映射问题。 要解决此问题,您需要创建一个newcustom类,其中包含您从查询中获取的所有字段/属性。

让我们假设您创建一个自定义类,然后说RouteMapper然后使用像

这样的代码进行映射
select new RouterMapper
{
     RouteMapper.TrackPointId = t.TrackPointId, RouteMapper.RouteFK=t.RouteFK,    RouteMapper.SourceName = r.SourceName
}

这种方式现在返回List&lt; RouteMapper&GT;

答案 2 :(得分: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);