我正在使用nHibernate从Sql Server数据库中检索订单集合(及其订单行)。
这是我的 ShipmentOrder 类:
public class ShipmentOrder
{
private ICollection<ShipmentDetail> _ShipmentsDetails;
public virtual ReadOnlyCollection<ShipmentDetail> ShipmentsDetails
{
get { return (new List<ShipmentDetail>(_ShipmentsDetails).AsReadOnly()); }
}
}
nHibernate返回一个IList,其中包含所有细节(ShipmentsDetails)(因为我急于加载它们)。
现在,我想过滤我的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();
但我意识到我获得了同一行的多个结果。
我已经像这样转换了lamda表达式:
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)。
答案 0 :(得分:1)
这看起来像Linq2Objects,因此IList结果包含重复的记录,可能你急切地提取到深层次,不幸导致重复的根实体。在查询中使用distinctrootentity-resulttransformer