PagedList в MVC3 с IQueryable

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

Сущность или сложный тип BusinessLogic.CompanyWithDivisionCount нельзя создать в запросе LINQ to Entities.

Мне нужно получить информацию из таблицы «Компания» и количество подразделений каждой компании из таблицы «Подразделение», а затем сделать PagedList. Вот моя таблица "Компания":

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;

using BusinessLogic.Services;
using BusinessLogic.Models.ValidationAttributes;

namespace BusinessLogic.Models
{
    public class Company
    {
        public Company()
        {
            Country = "US";
            Status = true;
        }

        public int Id { get; set; }

        [Required]
        [UniqueCompanyName]
        public string Name { get; set; }

        public string Street { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public int Zip { get; set; }
        public string Country { get; set; }

        public string ContactInfo { get; set; }

        [Required]
        public DateTime EffectiveDate { get; set; }
        public DateTime TerminationDate { get; set; }

        public bool Status { get; set; }

        [Required]
        public string URL { get; set; }
        public string EAP { get; set; }

        public string EAPCredentials { get; set; }

        public string BrandingColors { get; set; }

        public string Comments { get; set; }
    }
}

Вот моя модель домена:

public class Company
{
    public Company()
    {
        Country = "US";
        Status = true;
    }

    public int Id { get; set; }

    [Required]
    [UniqueCompanyName]
    public string Name { get; set; }

    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public int Zip { get; set; }
    public string Country { get; set; }

    public string ContactInfo { get; set; }

    [Required]
    public DateTime EffectiveDate { get; set; }
    public DateTime TerminationDate { get; set; }

    public bool Status { get; set; }

    [Required]
    public string URL { get; set; }
    public string EAP { get; set; }

    public string EAPCredentials { get; set; }

    public string BrandingColors { get; set; }

    public string Comments { get; set; }
}

public class CompanyWithDivisionCount: Company // I'm using this
{
    public int DivisionCount { get; set; }
}

Вот мой контроллер:

public ActionResult CompaniesList(int? page)
{
    var pageNumber = page ?? 1;

    var companies = companyService.GetCompaniesWithDivisionsCount2();

    var model = companies.ToPagedList(pageNumber, PageSize);

    return View(model);
}

А вот моя служебная часть:

public IQueryable<CompanyWithDivisionCount> GetCompaniesWithDivisionsCount2()
{
    return (from c in dataContext.Companies.AsQueryable()
            select new CompanyWithDivisionCount
            {
                Id = c.Id,
                Name = c.Name,
                Status = c.Status,
                EffectiveDate = c.EffectiveDate,
                URL = c.URL,
                EAP = c.EAP,
                EAPCredentials = c.EAPCredentials,
                Comments = c.Comments,
                DivisionCount = (int)dataContext.Divisions.Where(b => b.CompanyName == c.Name).Count()
            });
}

}

Спасибо за помощь!!!


person user1545035    schedule 09.08.2012    source источник


Ответы (2)


Создатель PagedList здесь. Это не имеет ничего общего с PagedList, а скорее с проблемой Entity Framework (я не эксперт по Entity Framework, поэтому не могу вам помочь). Чтобы убедиться, что это правда, напишите модульный тест в следующих строках:

[Test]
public void ShouldNotThrowAnException()
{
    //arrange
    var companies = companyService.GetCompaniesWithDivisionsCount2();

    //act
    var result = companies.ToList();

    //assert
    //if this line is reached, we win! no exception on call to .ToList()
}
person Troy    schedule 09.08.2012

Я бы рассмотрел возможность изменения вашей модели данных, если это возможно, чтобы вместо того, чтобы связывать компании с подразделениями по строкам имен, вместо этого используйте правильно поддерживаемую связь внешнего ключа между двумя объектами (подразделения должны содержать внешний ключ CompanyID). Это имеет ряд преимуществ (включая производительность и целостность данных) и почти наверняка облегчит вашу жизнь в будущем, если вам потребуется внести дальнейшие изменения в свое приложение (или если какая-либо компания когда-либо решит, что она может изменить свое название).

Если вы создадите правильное отношение внешнего ключа, ваша модель предметной области может выглядеть так:

public class Company
{
    ...

    public virtual ICollection<Division> Divisions{ get; set; }

    public int DivisionCount
    {
         get 
         {
              return this.Divisions.Count()
         }
    }

    ...
}
person AlexC    schedule 09.08.2012