Проблема с включением расширения на IObjectSet не работает - PullRequest
2 голосов
/ 09 ноября 2010

Может ли кто-нибудь помочь мне оценить, почему код ниже не работает.Я использую общий метод расширения для реализации Include при использовании IObjectset.В наших репозиториях мы видели, что это не возвращалось правильно, поэтому я выделил код в тестовом приложении, как показано ниже.Я также включил контекст на основе интерфейса, если это может оказаться уместным, и снимок экрана с соответствующим разделом модели.Это происходит для всех включений в свойствах IObjectSet, а не только для DPASelections, которые я выбрал для этого примера.

Если я обновляю контекст, чтобы вернуть ObjectSet (все еще используя объекты POCO), а не IObjectSet, все работает нормально.При использовании IObjectSet и метода расширения и пошаговом выполнении кода я вижу, что метод расширения завершается правильно с вызовом ObjectQuery, к которому мы приводим данные, но включенные сущности никогда не возвращаются на графике.Как уже было сказано, это прекрасно работает, когда я не взаимодействую с Context и не возвращаю свойства ObjectSet, поэтому вызываю функцию Include непосредственно для ObjectSet.

Я не получаю никаких ошибок при выполнении запроса, так что это не то же самоеа также несколько других вопросов по SO, которые относятся к скомпилированным запросам.

Кто-нибудь еще испытывал проблемы с реализацией этого метода расширения или кто-нибудь может заметить, что я делаю здесь неправильно?

Любая помощь оченьоценил.

        static void Main(string[] args)
    {
        using (var context = new AssocEntities())
        {
            context.ContextOptions.LazyLoadingEnabled = false;
            Candidate candidate = context.Candidates
                                        .Include("DPASelections.DPAOption")
                                        .SingleOrDefault(c => c.Number == "N100064");

            //Count is 0 when using ext. method and IObjectSet through AssocContext but correct when using Include
            //on ObjectSet through AssocContext
            Console.WriteLine("DPASelection count = {0}",candidate.DPASelections.Count);

            //This is always null when using IObjectSet and ext. method but populated
            //when using Include on ObjectSet
            var option = candidate.DPASelections.First().DPAOption;

            Console.WriteLine("First DPAOption = {0} : {1}",option.Id,option.Text);

        }

        Console.ReadLine();
    }
}

public static class Extensions
{
    public static IQueryable<TSource> Include<TSource>(this IQueryable<TSource> source, string path)
    {
        var objectQuery = source as ObjectQuery<TSource>;

        if (objectQuery != null)
        {
            objectQuery.Include(path);
        }

        return source;
    }
}

//Subset of custom context implementing IObjectSet as returns.
//Works fine when I return ObjectSet rather than IObjectSet and use
//the Include method directly
public partial class AssocEntities : ObjectContext
{
    public const string ConnectionString = "name=AssocEntities";
    public const string ContainerName = "AssocEntities";

    #region Constructors

    public AssocEntities()
        : base(ConnectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = true;
    }

    public AssocEntities(string connectionString)
        : base(connectionString, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = true;
    }

    public AssocEntities(EntityConnection connection)
        : base(connection, ContainerName)
    {
        this.ContextOptions.LazyLoadingEnabled = true;
    }

    #endregion

    #region IObjectSet Properties

    public IObjectSet<Address> Addresses
    {
        get { return _addresses ?? (_addresses = CreateObjectSet<Address>("Addresses")); }
    }
    private IObjectSet<Address> _addresses;

    public IObjectSet<Answer> Answers
    {
        get { return _answers ?? (_answers = CreateObjectSet<Answer>("Answers")); }
    }
    private IObjectSet<Answer> _answers;

    public IObjectSet<Candidate> Candidates
    {
        get { return _candidates ?? (_candidates = CreateObjectSet<Candidate>("Candidates")); }
    }
}

И модель ... alt text

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Мне нужно было заменить objectQuery.Include(path); на objectQuery = objectQuery.Include(path);

0 голосов
/ 24 сентября 2013

В .Net Framework 4.0 есть встроенный метод Extention для Include, просто добавьте пространство имен System.Data.Entity.

Использует отражение - вот как это работает:

private static T CommonInclude<T>(T source, string path)
{
  MethodInfo method = source.GetType().GetMethod("Include", DbExtensions.StringIncludeTypes);
  if (!(method != (MethodInfo) null) || !typeof (T).IsAssignableFrom(method.ReturnType))
    return source;
  return (T) method.Invoke((object) source, new object[1]
  {
    (object) path
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...