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>。
答
由于您的查询从两个不同的表中选择属性,显然它不再返回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);
我编辑可以张贴 – Kabi
无法理解你想要的这里......你要填单子和使用LINQ查询路由实体??? –
Dinesh