Я использую 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).