Использование подзапроса в poco для заполнения свойства - PullRequest
0 голосов
/ 14 августа 2011

Я пытаюсь использовать свойство в POCO, которое использует LINQ to ENTITY, чтобы извлечь первый объект из свойства HashSet в том же POCO. Мой объект содержит следующее:

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 при создании объекта, только я могу сделать это после заполнения. Есть ли способ, которым я могу заставить это работать? Прямо сейчас он говорит мне:

Указанный элемент типа 'ArivalStation' не поддерживается в LINQ для Сущности. Только инициализаторы, элементы сущностей и навигация сущностей свойства поддерживаются.

Могу ли я что-то сделать, чтобы получить доступ к этой информации о недвижимости, вместо того, чтобы постоянно делать объединения, когда мне нужна информация?

Спасибо.

1 Ответ

0 голосов
/ 14 августа 2011

Вы не можете использовать пользовательские свойства в запросе linq-to-entity.Можно использовать только свойства, сопоставленные непосредственно с базой данных = у вас должен быть подзапрос непосредственно в вашем запросе linq-to-entity, возвращающем ваш 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.

...