2016-11-25 62 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

哦,我们正在接近!这不只是它,但我会继续玩。 –