LINQ:填充LIST<>通过多个导航

时间:2016-11-25 17:07:13

标签: c# sql asp.net-mvc entity-framework linq

好的,我会试着让它变得有意义。

在模型中,Lead,以及其他属性中,我们有以下内容:

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

我从Lead的所有行的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()

这不会引发错误,但它会为每个代码返回一行数据,这不是我需要的。

1 个答案:

答案 0 :(得分: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