Entity Framework проекция LINQ в пользовательский тип приводит к отсутствию данных - PullRequest
3 голосов
/ 05 октября 2010

У меня есть много-много отношений между Подрядчиками и SafetyCouncils.К ним присоединяется мостовая таблица ContractorsSafetyCouncils, которая состоит из ContractorId и SafetyCouncilId.Эти 2 столбца образуют составной ключ.Это отношение правильно отображается в EF4.У сущности Подрядчик есть свойство:

public virtual ICollection<SafetyCouncil> SafetyCouncils
{
    get;
    set;
}

А у сущности SafetyCouncil есть свойство:

public virtual ICollection<Contractor> Contractors
{
    get;
    set;
}

При доступе к этим свойствам с помощью отложенной загрузки из одного объекта Подрядчика или SafetyCouncil они работают.именно так, как и ожидалось.Но при обращении к этому отношению в запросе:

from c in ContractorRepository.All()
where c.PQFs.Count() > 0
let psmAudits = c.PQFs.SelectMany(pqf => pqf.Audits)
let psmAudit = psmAudits.FirstOrDefault(audit => audit.CompletedDate == psmAudits.Max(a => a.CompletedDate))
let scsAudits = c.PQFs.SelectMany(pqf => pqf.SCSAudits)
let scsAudit = scsAudits.FirstOrDefault(audit => audit.CompletedDate == scsAudits.Max(a => a.CompletedDate))
select new MasterListItem()
{
    AdministratorNotes = c.AdminFlags.Where(f => f.IsActive && f.ForPQF).Select(f => f.Text),
    CanViewInfo = false,
    ContractorName = c.ContractorName,
    ContractorId = c.Id,
    ContractorTaxId = c.TaxId,
    SafetyCouncilIds = c.SafetyCouncils.Select(sc => sc.Id),
    PQFSubmitted = c.PQFs.Max(p => p.PQFInfo.SubmittedDate.Value),
    PSMAuditId = psmAudit.Id,
    PSMAuditComplete = psmAudit.CompletedDate,
    PSMAuditStatus = psmAudit.Status.Description,
    SCSAuditId = scsAudit.Id,
    SCSAuditComplete = scsAudit.CompletedDate
};

Проблема возникает с:

SafetyCouncilIds = c.SafetyCouncils.Select(sc => sc.Id),

Для каждой записи коллекция SafetyCouncilIds имеет 0 членов, если она основана на данных в базе данных.с каждой записью должен быть связан как минимум 1 SafetyCouncilId.

Если я выполняю тот же запрос, но проецирую на анонимный тип вместо типа MasterListItem, он работает правильно.Почему я не могу проецировать этот запрос в свой пользовательский тип?

Обновление: Мой POCO MasterListItem содержал следующие свойства:

public string SafetyCouncilIdsString
{
    get;
    set;
}

public IEnumerable<int> SafetyCouncilIds
{
    set
    {
        StringBuilder sb = new StringBuilder(",");

        foreach (var id in value)
        {
            sb.Append(id);
            sb.Append(",");
        }

        this.SafetyCouncilIdsString = sb.ToString();
    }
}

Причиной было свойство SafetyCouncilIdsпроблемы.Я изменил это на автоматическое свойство и построил строку в другом месте, и проецирование на POCO работало как шарм.

Ответы [ 3 ]

2 голосов
/ 12 октября 2010
public IEnumerable<int> SafetyCouncilIds
{
    set
    {
        StringBuilder sb = new StringBuilder(",");

        foreach (var id in value)
        {
            sb = sb.Append(id).Append(","); // <-- try this
            // *or sb = sb.AppendFormat("{0},", id);*
        }

        this.SafetyCouncilIdsString = sb.ToString();
    }

}

0 голосов
/ 30 августа 2011

Причиной проблемы было свойство SafetyCouncilIds.Я изменил это на автоматическое свойство и построил строку в другом месте, и проецирование на POCO работало как шарм.

0 голосов
/ 05 октября 2010

У меня есть два предложения:

  1. Попробуйте изолировать проблему, удалив лишние части запроса.
  2. Сравните два сгенерированных SQL-запроса и найдите различия.

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

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