IQueryable<T>.Include<T, объект >> (выражение<Func <T, объект >> не работает

Я пытаюсь загрузить свойства навигации с помощью метода IQueryable Include, однако, хотя выражение правильное, я не получаю никаких результатов.

вот код

protected void LoadNavigationProperty(ref IQueryable<T> query, Expression<Func<T, object>>[] navigationProperties)
{
    if ((query != null) && (navigationProperties != null))
    {
        foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
        {
            query.Include<T, object>(navigationProperty);
        }
    }
}

Я поставил точку останова на query.Include и проверил данные:

navigationProperties[0] = { n => n.UserStatus }  
navigationProperties[1] = { n => n.PrivilegeLevel }

Пройдя мимо строки включения, я снова проверил значение запросов и обнаружил, что оно не включает свойства nav

2 ответа

Решение

Include() не меняется query Например, он возвращает новый. Вы должны назначить его обратно query:

protected void LoadNavigationProperty(ref IQueryable<T> query, Expression<Func<T, object>>[] navigationProperties)
{
    if ((query != null) && (navigationProperties != null))
    {
        foreach (var navigationProperty in navigationProperties)
        {
            query = query.Include<T, object>(navigationProperty);
        }
    }
}

Марчин объясняет, почему это не сработало (.Include( действительно изменяет запрос) однако я просто хотел дать вам альтернативный способ сделать это, чтобы вы могли использовать метод в качестве метода расширения, чтобы он мог использоваться в строке так же, как .Include( или же .Select( было бы.

public static IQueryable<T> LoadNavigationProperty(this IQueryable<T> query, Expression<Func<T, object>>[] navigationProperties)
{
    if ((query != null) && (navigationProperties != null))
    {
        foreach (var navigationProperty in navigationProperties)
        {
            query = query.Include<T, object>(navigationProperty);
        }
    }

    return query;
}
Другие вопросы по тегам