2015-10-27 81 views
0

我被一個問題困住了,在那裏我覺得我可以俯視一些東西。mvc index with many to firstordefault

我想獲得一對一的結果從一對多關係爲一個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和Lambda表達式來獲取數據到視圖模型例如

 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 
        }; 

但我不明白它的工作...

視圖應顯示與

Name Position Company 
Hans Boss  Sausage House 
Tom Manager Burger Building 

查詢一個asp.net mvc的索引視圖的關係是沒有問題的,並得到相關的聯繫人和公司,但不是每個聯繫人都有一個職位,有些人有不止一個。所以我想包括所有聯繫人和所有當前關係。

我知道改變關係或者我的想法應該看起來像是更容易。

但也許有人可以幫忙。

謝謝!

UPDATE

謝謝你的快速反應,你是絕對正確的與您的意見。但我的問題不是查詢的彙編。無論如何,此查詢無法正常工作。我堅持如何讓模型充滿期望的結果,如果這是可能的話。我可能需要採取不同的方法,我已經嘗試了一些。也許有人可以幫助一個具有預期結果的查詢。

回答

0

如果最終結果是投影,則不能使用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

謝謝!我加了兩個失蹤的「s」。因爲我沒有複製項目中的代碼,所以我只是在這篇文章中犯了一個錯誤。我會試試這個! – Dreki

+0

謝謝!它完美的作品。 – Dreki

0

編輯我以前的代碼一種新的方法:

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 
    }; 

雖然我不知道如果我的理解定義正確。

爲了進一步說明,請參見MSDN文檔:

了一個小圖,我想我只是要離開它這裏以及澄清: Diagram

+0

編輯一個新的代碼示例 – 321polorex123

+0

謝謝!即使我忘記了第二個「關係」背後的「s」,你也能理解模型的正確性。我的問題有點不同。不與Evers聯繫有關係。但我需要所有的聯繫人和最近的關係或沒有。 – Dreki