Упрощенная модель данных:
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
, что и выше.
Я не уверен, что еще нужно сделать в этот момент. Любые предложения о том, чтобы попробовать, будет принята с благодарностью. Кроме того, я новичок в публикации вопросов здесь, так что если я что-то пропустил, дайте мне знать, и я обновлю свой вопрос.