好吧,我会尽力让这个有意义。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()
这不会引发错误,但它的返回数据行的每个代码,这不是我所需要的。
难道你不能做'Codes = l.QuoteRevisions.SelectMany(qr => qr.SelectMany(qri => qri.QuoteRevisionProduct).Select(p => p.Code)' – KMoussa
你可以把它作为答案吗?qr 。不会有SelectMany作为选项,但是我知道你在哪里。 –