如何在父级和子级同时应用筛选器来获取子级集合

本文关键字:筛选 集合 获取 应用 | 更新日期: 2023-09-27 18:11:50

我正在使用nHibernate从Sql Server数据库检索订单(及其订单行)的集合。

这是我的ShipmentOrder类:

public class ShipmentOrder
{
        private ICollection<ShipmentDetail> _ShipmentsDetails;
        public virtual ReadOnlyCollection<ShipmentDetail> ShipmentsDetails
        {
            get { return (new List<ShipmentDetail>(_ShipmentsDetails).AsReadOnly()); }
        }   
}

nHibernate返回一个装载了所有细节(ShipmentsDetails)的列表(因为我是Eager加载它们)。

现在,我想过滤我的ShipmentOrder和ShipmentDetail集合,并返回一个ShipmentDetail集合。

我试过这样做:

IList<ShipmentOrder> Results;
// Fetch orders using nHibernate
Results = FetchOrders();
var shipmentLines = Results
    .Where(x => x.Company == "XXX" && x.OrderNumber == "111")
    .SelectMany(x => x.ShipmentsDetails)
    .Where(s => s.RowNumber == 1 && s.RowSeq == 0)
    .ToList();

但是我已经意识到我得到了同一行的多个结果。

我把lambda表达式转换成这样:

var shipmentLines = Results
    .Where(x => x.Company == "XXX" && x.OrderNumber == "111")
    .SelectMany(x => x.ShipmentsDetails)
    .Where(s => s.RowNumber == 1 && s.RowSeq == 0)
    .Distinct()
    .ToList();

,它工作得很好。我想知道如果没有不同的,是否有更好的方法来实现相同的结果。

:

我在这里使用SelectMany,因为这是我发现将过滤器应用于子(ShipmentsDetails)的唯一方法。

如何在父级和子级同时应用筛选器来获取子级集合

这看起来像Linq2Objects,因此IList Results包含重复的记录,可能您对深层进行了渴望抓取,不幸的是导致重复的根实体。在查询

中使用distinctrooity -resulttransformer