繁体   English   中英

检索包含数据的对象列表以及连接中的行数

[英]Retrieving list of objects with data plus count of rows in join

我在 ASP.NET MVC 项目 EF 6 中有一个 EF 查询。为了形成我的数据,我有 2 个连接,然后我必须遍历它们以解析其他一些属性,特别是另一个表中的记录数。

我想要做的是重构代码以在查询期间获取计数。

这是我的尝试,线索表上的连接是我正在处理的。

var orderItems = dataContext.ES_OrderDetail
                .Join(dataContext.ES_Products, od => od.ProductID, p => p.ProductID, (od, p) => new { od, p })
                .Join(dataContext.ES_Orders, od => od.od.OrdID, o => o.OrdID, (od, o) => new { od, o })
                .Join(dataContext.leads, od => new { DID = od.od.od.DeviceID,  CID = od.o.CompanyID.Value, EID = od.o.EventId.Value }, 
                    l => new { DID = l.unitID, CID = l.companyID, EID = l.eventID }, (od,l) => new { order = od.o, odetail = od.od, lead = l })

通过这个查询,我从它 Select() 到一个对象中以获取我需要的各种数据,例如:

.Select(s => new OutputClass
{
    OrderId = s.order.OrdId,
    ItemId = s.odetail.od.ItemId,
    //etc
}.ToList();

我想做的是,在 Select() 中,有类似的东西

LeadCount = s.leads.Count()

但 Lead 是对实体的引用,简而言之,我不确定如何加入实体但对其执行聚合,而不是访问数据。 在我调用 Select() 之后,我然后遍历每个并执行另一个查询以获取计数。

NetMage 是正确的组加入。 加入团体会给你你需要的东西( leads.Count() )。 我确实将方法语法更改为查询语法。 在这种情况下,查询语法对我来说更具可读性(您可以在此处阅读有关这两种语法的更多信息: https : //michaelscodingspot.com/when-to-use-c-linq-with-query-syntax-over-method-syntax / )。

下面的查询使用LeadId主键列,但这可能会在您的代码中发生变化。 我不知道Lead表的主键是什么。

var orderItemsNew = (from orderDetail in dataContext.ES_OrderDetail
                 join product in dataContext.ES_Products on orderDetail.ProductID equals p.ProductID
                 join order in dataContext.ES_Orders on orderDetail.OrdID equals order.OrdID
                 join lead in dataContext.leads on new { DID = orderDetail.DeviceID, CID = order.CompanyID.Value, EID = order.EventId.Value } equals
                                                   new { DID = lead.unitID, CID = lead.companyID, EID = lead.eventID}
                 group lead.LeadId by new {
                        OrderId = order.OrdId,
                        ItemId = orderDetail.ItemId
                        // etc
                    }
                 into leadCountJoin 
                 select new OutputClass 
                 {
                    LeadCount = leadCountJoin.Count()
                    OrderId = leadCountJoin.Key.OrderId,
                    ItemId = leadCountJoin.Key.ItemId,
                    // etc
                 });

您还可以列出必要的关键字来对潜在客户记录进行分组。 现在只有OrderIdItemId是查询的一部分,但可能您需要列出两个以上的键。

PS:如果您坚持使用 group by 语句,请提供包含所有OutputClass属性的整个查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM