2016-11-25 61 views
-1

好吧,我會盡力讓這個有意義。LINQ:通過多個導航填充列表<>

在模型中,鉛等性質,我們有這些:

public class Lead 
{ 
    .... 
    public int LeadID {get; set; } 
    public virtual ICollection<QuoteRevision> QuoteRevisions { get; set; } 
    .... 
} 

而且QuoteRevision ...

public class QuoteRevision 
{ 
    .... 
    [ForeignKey(nameof(LeadID))] 
    public virtual Lead Lead { get; set; } 

    public virtual ICollection<QuoteRevisionProduct> QuoteRevisionProduct{ get; set; } 
    .... 
} 

而對於QuoteRevisionProduct模型:

public class QuoteRevisionProduct 
{ 
    .... 
    [ForeignKey(nameof(QuoteRevisionID))] 
    public virtual QuoteRevision QuoteRevision { get; set; } 

    [ForeignKey("ProductID")] 
    public virtual Product Product { get; set; } 
    .... 
} 

最後...

public class Product 
{ 
    .... 
    public string Code { get; set; } 
    .... 
} 

好的。因此,這些是我需要查詢的模型,用於構建名爲QuoteSearchItem的對象,該對象具有多個屬性。這裏有兩個:

public class QuoteSearchItem 
{ 
    .... 
    public LeadID {get; set; } 
    public List<string> Codes { get; set; } 
    .... 
} 

我開始這個IQueryable的所有行的鉛:

leads = IQueryable<Lead> 

,然後做這個:

var results = from l in leads 
    from qr in l.QuoteRevisions 
    from rp in qr.RevisionProducts 
    select new QuoteSearchItem 
    { 
     .... 
     LeadID = l.LeadID, 
     AdditionalProducts = ??? 
     .... 
    }; 

我不知道怎麼樣獲取該代碼列表。我可以做到這一點:

Code = rp.Product.Code, 

而這將得到我一個單一的代碼,列表中的第一個。但是我如何得到所有匹配的?

我知道這是很多要遵循的。我希望這是有道理的。謝謝!

編輯:

這是(幾乎)是我在尋找的SQL:

SELECT 
    l.ID, 
    p.Code 
FROM 
    dbo.Leads AS l 
    JOIN QuoteRevisions qr ON qr.LeadID = l.ID 
    JOIN QuoteRevisionProducts qrp on qrp.QuoteRevisionID = qr.QuoteRevisionID 
    JOIN Products p on p.ProductID = qrp.ProductID 

除此之外,這將只是每個產品返回多行。但是,至少它提供了一個想法。

編輯2:

Code = l.QuoteRevisions.SelectMany(qr => qr.RevisionProducts).Select(p => p.Product.Code).ToList() 

這不會引發錯誤,但它的返回數據行的每個代碼,這不是我所需要的。

+0

難道你不能做'Codes = l.QuoteRevisions.SelectMany(qr => qr.SelectMany(qri => qri.QuoteRevisionProduct).Select(p => p.Code)' – KMoussa

+0

你可以把它作爲答案嗎?qr 。不會有SelectMany作爲選項,但是我知道你在哪裏。 –

回答

1

您可以使用SelectMany扁平化模式,並得到所有的代碼,這樣的事情:

var results = from l in leads  
select new QuoteSearchItem 
{ 
    .... 
    LeadID = l.LeadID, 
    Codes = l.QuoteRevisions.SelectMany(qr => qr.QuoteRevisionProduct) 
      .Select(p => p.Product.Code) 
    .... 
}; 

不知道如何你的數據庫看,但你也許可以用Distinct以及消除重複Codes

+0

好的,我們在裏頭ght方向,但我在qr.SelectMany(..)上遇到編譯錯誤。QuoteRevisions不包含'SelectMany'的定義 –

+0

是的,只是更新了它,我*認爲*應該工作,但目前無法測試 – KMoussa

+0

哦,我們正在接近!這不只是它,但我會繼續玩。 –