У меня возникла проблема, когда я чувствую, что что-то не замечаю.

Я пытаюсь получить результат один к одному из отношения один ко многим для представления индекса asp.net mvc.

У меня три класса

public class Contact
{
    public int ContactID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Relation> Relations { get; set; }
}

public class Relation
{
    public int RelationID { get; set; }
    public string Position { get; set; }
    public int CompanyID { get; set; }
    public int? ContactID { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

public class Company
{
    public int CompanyID { get; set; }
    public string CompanyName { get; set; }
    public virtual ICollection<Relation> Relations { get; set; }
}

Результат должен включать следующее

public class ContactViewModel
{
    public int ContactID { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    public string CompanyName { get; set; }
}

Я пробовал LINQ и лямбда-выражения, чтобы получить данные в модели просмотра, например.

        var contacts = from contact in db.Contacts
                   .Include(relation => relation.Relation
                        .Where(s => s.ContactID == contact.ContactID)
                        .OrderByDescending(d => d.StartDate)
                        .FirstOrDefault())
                   select new ContactViewModel
                    {
                        ContactID = contact.ContactID,
                        Name = contact.Name,
                        Position = relation.Position,
                        Company = relation.Company.CompanyName
                    };

Но у меня не получается работать ...

В представлении должно отображаться представление индекса asp.net mvc с

Name  Position   Company
Hans  Boss       Sausage House
Tom   Manager    Burger Building

Запросить отношение - не проблема и получить соответствующие контакты и компании, но не у каждого контакта есть должность, а у некоторых их больше одной. Поэтому я хотел бы включить все контакты и все текущие отношения.

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

Но может кто-нибудь все равно поможет.

Спасибо!

ОБНОВИТЬ

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

0
Dreki 28 Окт 2015 в 01:51

2 ответа

Лучший ответ

Вы не можете использовать Include, если конечным результатом является проекция, и вы не можете фильтровать выражения Include d.

Но это легко сделать, если вы используете ключевое слово let:

var contacts = from contact in db.Contacts
               let relation = contact.Relation
                              .OrderByDescending(d => d.StartDate)
                              .FirstOrDefault()
               select new ContactViewModel
               {
                   ContactID = contact.ContactID,
                   Name = contact.Name,
                   Position = relation.Position,
                   Company = relation.Company.CompanyName
               };

Кстати, сделайте себе одолжение и используйте существительные во множественном числе для имен свойств коллекции.

0
Gert Arnold 28 Окт 2015 в 23:43

Отредактировал мой предыдущий код для нового подхода:

var contacts = from relation in db.Relations
    join contact in db.Contacts on relation.ContactID equals contact.ContactID
    join company in db.Companies on relation.CompanyID equals company.CompanyID
    orderby relation.StartDate descending
    select new ContactViewModel
    {
        ContactID = contact.ContactID,
        Name = contact.Name,
        Position = relation.Position,
        Company = company.CompanyName
    };

Хотя я не уверен, правильно ли я понял определение public virtual ICollection<Relation> Relation { get; set; }.

Дополнительные объяснения см. В документации MSDN:

Сделал небольшую диаграмму, думаю, я просто оставлю ее здесь для пояснения: Diagram

0
321polorex123 28 Окт 2015 в 19:55