C # - LINQ to EF - фильтровать несколько дочерних коллекций - PullRequest
0 голосов
/ 15 мая 2018

Упрощенная модель данных:

Customer
--------------
CustomerId (int)
IsActive (bool)
... (a bunch of other fields)
Applications (List<Application>)

Application
--------------
ApplicationId (int)
IsActive (bool)
... (a bunch of other fields)
Member (List<Member>)

Member
--------------
MemberId (int)
IsActive (bool)
... (a bunch of other fields)

Учитывая объект Customer (searchEntity), я хочу быть в состоянии найти, если какие-либо другие записи в БД имеют определенные поля, которые соответствуют данному объекту. Я создал запрос, который, по моему мнению, вернул бы правильный результат:

foreach (var memberEntity in searchEntity.MEMBER_T.Where(m => m.ISACTIVE == 1).ToList())
{
    bool result = Entities.CUSTOMER_T.Where(c =>
        c.CUSTOMERID != searchEntity.CUSTOMERID && c.ISACTIVE == 1 && c.APPLICATION_T.Where(a =>
            a.ISACTIVE == 1 && a.APPLICATIONSTATUSID == 4 && a.MEMBER_T.Where(m =>
                m.ISACTIVE == 1 && m.FIRSTNAME == memberEntity.FIRSTNAME && m.LASTNAME == memberEntity.LASTNAME
            ).Any()
        ).Any()
    ).Any();
}

Это должно возвращать true, если searchEntity имеет члена, который соответствует Имени и Фамилии члена в БД, которая принадлежит Приложению с ApplicationStatus == 4, и это приложение принадлежит Клиенту с CustomerId, не равным запросу searchEntity. CustomerId.

Первой проблемой, с которой я столкнулся, была ошибка Oracle ORA-00904: "Extent1"."CUSTOMERID": invalid identifier. Я заметил, что если я изменил свой запрос, исключив a.MEMBER_T.WHERE(...), что он будет выполняться без ошибок, за исключением того, что это самая важная часть этого запроса.

При поиске в StackOverflow было выдвинуто несколько предложений ( LINQ - отфильтровать дочернюю коллекцию , LINQ - отфильтровать коллекцию внутри коллекции ), чтобы использовать .Select для создания нового объекта и назначения отфильтрованной дочерней коллекции. на новый объект, как показано ниже:

bool result = Entities.CUSTOMER_T.Where(c =>
    c.CUSTOMERID != searchEntity.CUSTOMERID && c.ISACTIVE == 1
).Select(c => new Database.CUSTOMER_T
{
    CUSTOMERID = c.CUSTOMERID,
    APPLICATION_T = c.APPLICATION_T.Where(a =>
        a.ISACTIVE == 1 && a.APPLICATIONSTATUSID == 4
    ).Select(a => new Database.APPLICATION_T
    {
        APPLICATIONID = a.APPLICATIONID,
        ADDITIONALASSISTANCE_T = a.MEMBER_T.Where(m =>
            m.ISACTIVE == 1
            && m.FIRSTNAME == memberEntity.FIRSTNAME
            && m.LASTNAME == memberEntity.LASTNAME
        )
    }
    ).Where(a => a.ADDITIONALASSISTANCE_T.Any())
}
).Where(c => c.APPLICATION_T.Any()).Any();

Это привело к ошибке The entity or complex type 'Entities.CUSTOMER_T' cannot be constructed in a LINQ to Entities query. Я попытался исправить это с помощью DTO ( Объект не может быть создан в запросе LINQ to Entities ), но я получил ту же ошибку ORA-00904, что и выше.

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

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