Найдите значение в дочернем свойстве основной сущности типа List <T>в другом List <T>и верните основную сущность - PullRequest
0 голосов
/ 29 мая 2020

Я столкнулся с проблемой LINQ2 Sql, когда Visual Studio предлагает возможное исправление, но это не работает. Представьте себе следующее:

Мне нужно вернуть объект типа IEnumerable QmmProductionOrderInteruptCardCollection содержит список, который снова содержит список, каждая заметка имеет свойство «Проверено» типа boolean.

Теперь я хочу посмотреть для этого свойства в каждой заметке, где Reviewed имеет значение false, но возвращает верхний объект IEnumerable

Теперь это мой оператор LINQ, который вместо этого вернет IEnumerable без преобразования:

return await ApplicationDbContext.Qmm_ProductionOrderInteruptCardCollections
            .Select(x => x.ProductionOrder)
            .SelectMany(x => x.Notes)
            .Where(n => !n.IsReviewed)
            .ToListAsync();

Visual studio предлагает приведение к типу IEnumerable следующим образом:

return (IEnumerable<QmmProductionOrderInteruptCardCollection>)await ApplicationDbContext.Qmm_ProductionOrderInteruptCardCollections
            .Select(x => x.ProductionOrder)
            .SelectMany(x => x.Notes)
            .Where(n => !n.IsReviewed)
            .ToListAsync();

Но при тестировании я получаю InvalidCastException

Невозможно привести объект типа 'System.Collections.Generi c .List 1[BIP_Models.Domain.Qmm.QmmNote]' to type 'System.Collections.Generic.IEnumerable 1 [BIP_Models.Domain.Qmm.QmmProductionOrderInteruptCardCollection] '.

Есть ли у вас какие-либо мысли, как решить эту проблему?

Для лучшего понимания это будет sql выписка, которую я хотел бы передать:

SELECT 
* 
FROM QmmProductionOrderInteruptCardCollections pic 
JOIN QmmProductionOrders p ON p.Id = pic.ProductionOrderId 
JOIN QmmNotes n ON n.ProductionOrderId = p.Id 
WHERE 
n.IsReviewed = 0;

С уважением и наилучшими пожеланиями. Патрик

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы не должны использовать здесь Select, он выполняет проекцию на IEnumerable, и здесь вы каждый раз возвращаете новый тип.

Вместо этого просто используйте Where вот так:

return await ApplicationDbContext.Qmm_ProductionOrderInteruptCardCollections
        .Where(x => x.ProductionOrder.Notes.Any(y => !y.IsReviewed))
        .ToListAsync();
1 голос
/ 29 мая 2020

Попробуйте:

return await ApplicationDbContext.Qmm_ProductionOrderInteruptCardCollections
        .Where(x => x.ProductionOrder.Notes.Any(n => !n.IsReviewed))
        .ToListAsync();

Это должно вернуть вам Qmm_ProductionOrderInteruptCardCollection, в которых есть хотя бы одна непроверенная заметка.

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