在poco中使用子查询来填充属性

时间:2011-08-13 21:25:17

标签: entity-framework linq-to-entities poco

我正在尝试在POCO上使用一个属性,该属性使用LINQ to ENTITY将第一个对象从同一个POCO上的HashSet属性中拉出来。我的对象包含以下内容:

public virtual HashSet<ScheduleWaypoint> ScheduleWaypoints { get; set; }

public ScheduleWaypoint ArrivalStation {
        get {
            if (this.ScheduleWaypoints != null && this.ScheduleWaypoints.Count() > 0) {
                return this.ScheduleWaypoints.Where(row => row.WaypointType.Type.Trim() == "SA").OrderByDescending(row => row.ScheduledTime).First();
            } else
                return null;
        }
    }

如果我只使用一个对象,我不能确定这是否可行,但我知道它在其他linq查询中不起作用。创建对象时,我无法访问ScheduleWaypoint的ID,只有在填充后才可以执行此操作。我有办法让这个工作吗?现在它告诉我:

  

LINQ to不支持指定的类型成员'ArivalStation'   实体。仅初始化程序,实体成员和实体导航   支持属性。

我需要做些什么才能在属性上访问此信息,而不是在需要信息时不断地进行连接?

感谢。

1 个答案:

答案 0 :(得分:0)

您无法在linq-to-entities查询中使用自定义属性。只能使用直接映射到数据库的属性=您必须直接在linq-to-entities查询中返回子查询,并返回ArrivalStation。也许它可以包装为简单的扩展方法:

public static IQueryable<ScheduleWaypoint> GetArrivalStation(this IQueryable<ScheduleWaypoints> waypoints, int routeId)
{
    return waypoints.Where(w => w.WaypointType.Type.Trim() == "SA" && w.Route.Id == routeId)
                    .OrderByDescending(w => w.ScheduledTime)
                    .FirstOrDefault();
}

Route是您的主要实体,其中定义了方式点。使用FirstOrDefault是因为子查询不能仅使用First