我使用下面的代码从两个表中获取记录,但我希望将结果放在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>();
}
......
答案 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);