Расширение запроса для LINQ - PullRequest
5 голосов
/ 05 февраля 2010

У меня есть некоторый код для строгой типизации Includes () в linq, вот так ...

public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> subSelector)
    {
        return mainQuery.Include(((subSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name);
    }

    /// <summary>
    /// Old way: (from dbUser in DataSource.DataContext.Users.Include("UserSubscriptions.ChurchSubscriptions") select dbUser);
    /// New way: (from dbUser in DataSource.DataContext.Users.Include<Users, UserSubscriptions>(u => u.UserSubscriptions, s => s.ChurchSubscriptions) select dbUser);
    /// </summary>
    public static ObjectQuery<T> Include<T, Q>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, Expression<Func<Q, object>> qSubSelector)
    {
        string tProperty = ((tSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name;
        string qProperty = ((qSubSelector.Body as MemberExpression).Member as System.Reflection.PropertyInfo).Name;
        string path = string.Format("{0}.{1}", tProperty, qProperty);
        return mainQuery.Include(path);
    }

Мой вопрос такой: могу ли я написать более общую учетную запись функции для любого уровня последовательных включений? Вместо того, чтобы переписывать его, скажем, 3, 4 и т. Д. Включают типы?

1 Ответ

2 голосов
/ 05 февраля 2010

Полагаю, под последовательными вы подразумеваете дополнительные вспомогательные селекторы.

Если это так, то следующая функция использует массив параметров для дополнительных субселекторов (после первого), сохраняя при этом, что первое выражение связано с тем же типом T, что и другие.

public static ObjectQuery<T> Include<T>(this ObjectQuery<T> mainQuery, Expression<Func<T, object>> tSubSelector, params Expression<Func<object, object>>[] subSelectors)
{
    var pathBuilder = new StringBuilder(((PropertyInfo)((MemberExpression)tSubSelector.Body).Member).Name);
    foreach (var selector in subSelectors)
    {
        pathBuilder.Append('.');
        pathBuilder.Append(((PropertyInfo)((MemberExpression)selector.Body).Member).Name);
    }

    return mainQuery.Include(pathBuilder.ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...