Метод Ado.net .include () не работает - PullRequest
0 голосов
/ 02 октября 2009

У меня есть эта функция

public static AdoEntity.Inspector GetInspectorWithInclude(int id, List<string> properties)
    {
        using (var context = new Inspection09Entities())
        {
            var query = context.Inspector;
            if (properties != null)
            {
                foreach (var prop in properties)
                {
                    if (!string.IsNullOrEmpty(prop))
                        query.Include(prop);
                }
            }
            return query.Where(i => i.ID == id).First();
        }
    }

, который я использую, чтобы получить своих «Инспекторов» из БД, и дополнительную функцию, указывающую, что «включать» в данные. Таким образом, он берет List <'string'> и включает их в запрос. Эта функция, похоже, не работает, потому что возвращаемый объект все еще не включает запрошенные данные. Может кто-нибудь сказать мне, что не так с этим методом / подходом.

Заранее спасибо.

Решение

Спасибо за предложение Миша Н. , я вынашивал этот помощник EF, который расширяет класс ObjectQuery. Надеюсь, что другие могут найти это полезным.

/// <summary>
/// The include extesion that takes a list and returns a object query with the included data.
/// </summary>
/// <param name="objectQuery">
/// The object query.
/// </param>
/// <param name="includes">
/// The list of strings to include.
/// </param>
/// <typeparam name="T">
/// </typeparam>
/// <returns>
/// An object query of T type with the included data.
/// </returns>
public static ObjectQuery<T> Include<T>(this ObjectQuery<T> objectQuery, List<string> includes)
{
    ObjectQuery<T> query = objectQuery;
    if (includes != null) includes.ForEach(s => { if (!string.IsNullOrEmpty(s)) query = query.Include(s); });

    return query;
}

Пример использования.

using(var context = new MyEntity())
{
    var includes = new List<string>
    {
        "Address",
        "Orders",
        "Invoices"
    }
    return context.CustomerSet.Include(includes).First(c => c.ID == customerID);
}

1 Ответ

3 голосов
/ 02 октября 2009

В вашем подходе нет ничего плохого, нужно изменить только одну маленькую вещь:

public static AdoEntity.Inspector GetInspectorWithInclude(int id, List<string> properties)
{
    using (var context = new Inspection09Entities())
    {
        var query = context.Inspector;
        if (properties != null)
        {
            foreach (var prop in properties)
            {
                if (!string.IsNullOrEmpty(prop))
                    query = query.Include(prop);// <--- HERE
            }
        }
        return query.Where(i => i.ID == id).First();
    }
}

Метод ObjectQuery.Include () возвращает измененный объект ObjectQuery, вы не вносили изменений в начальный запрос.

Надеюсь, это поможет

...