好的,我会试着让它变得有意义。
在模型中,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()
这不会引发错误,但它会为每个代码返回一行数据,这不是我需要的。
答案 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