Как получить коллекцию детей, применяя фильтры как для родителей, так и для детей - PullRequest
0 голосов
/ 21 октября 2011

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

1 Ответ

1 голос
/ 21 октября 2011

это похоже на Linq2Objects, поэтому результаты IList содержат дублирующиеся записи, вероятно, вы действительно стремитесь извлечь данные на глубокие уровни, что, к сожалению, приводит к дублированию корневых сущностей. использовать в запросе отдельный преобразователь-результат-преобразователь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...