C # Entity Framework 4.1: включить пути в запрос для загрузки связанных объектов - PullRequest
2 голосов
/ 21 октября 2011

Когда я запускаю эту строку кода

queryCompanies = (DbSet) queryCompanies.Include (path);

из этого метода:

     public Company GetCompanyById(int companyId)
     {
        List<string> includePaths = new List<string>();
        includePaths.Add("Addresses");
        includePaths.Add("Users");
        Company company = null;
        using (Entities dbContext = new Entities())
        {   
            var queryCompanies = dbContext.Companies;

            if (includePaths != null)
            {
                foreach (string path in includePaths)
                    queryCompanies = (DbSet<Company>)queryCompanies.Include(path);
            }

                company = (from c in queryCompanies
                           where c.Id.Equals(companyId)
                           select c).FirstOrDefault<Company>();
        }
        return company;
     }

Я получаю эту ошибку:

Невозможно привести объект типа 'System.Data.Entity.Infrastructure.DbQuery 1[ClassLibrary1.Company]' to type 'System.Data.Entity.DbSet 1 [ClassLibrary1.Company]'.

При компиляции у меня нет ошибок. В EF 4.0 этот код работает правильно, используя вместо DbSet <>, ObjectQuery <>.

Я новичок в EF 4.1, поэтому любое предложение будет полезным.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 21 октября 2011

Попробуйте это

 public Company GetCompanyById(int companyId)
 {
    List<string> includePaths = new List<string>();
    includePaths.Add("Addresses");
    includePaths.Add("Users");
    Company company = null;
    using (Entities dbContext = new Entities())
    {   
        var queryCompanies = dbContext.Companies.AsQueryable();

        if (includePaths != null)
        {
            foreach (string path in includePaths)
                queryCompanies = queryCompanies.Include(path);
        }

            company = (from c in queryCompanies
                       where c.Id.Equals(companyId)
                       select c).FirstOrDefault<Company>();
    }
    return company;
 }
1 голос
/ 21 октября 2011

DbSet наследуется от DbQuery , поэтому компилятор не будет жаловаться, поскольку приведение может быть допустимым. По-видимому, то, что возвращает DbSet<T>.Include, не является DbSet<T>, и приведение не выполняется во время выполнения.

Однако вам не нужно кастовать; вызов FirstOrDefault будет работать на DbQuery<T>.

0 голосов
/ 02 августа 2015

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

    List<TEntityType> GetEntityListTemplate(Expression<Func<TEntityType, bool>> expression = null)
    {
        List<TEntityType> entityList;
        DbQuery<TEntityType> query = null;

        Type entityType = typeof(TEntityType);
        PropertyInfo[] properties = entityType.GetProperties();

        using (DatabaseContext database = new DatabaseContext())
        {
            database.Database.Connection.Open();

            foreach (PropertyInfo property in properties)
            {
                if (property.PropertyType.FullName.Contains("Your.Identifier.Namespace"))
                {
                    if (query == null)
                    {
                        query = database.Set<TEntityType>().Include(property.Name);
                    }
                    else
                    {
                        query = query.Include(property.Name);
                    }
                }
            }

            if (query == null)
            {
                if (expression == null)
                {
                    entityList = database.Set<TEntityType>().ToList();
                }
                else
                {
                    entityList = database.Set<TEntityType>().Where(expression).ToList();
                }
            }
            else //(query!=null)
            {
                if (expression == null)
                {
                    entityList = query.ToList();
                }
                else
                {
                    entityList = query.Where(expression).ToList();
                }
            }
        }

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