Думайте в терминах наборов и реляционных данных, а не процедурно.Нелегко точно определить, что вы хотите, из вашего кода (что противоречит самому себе - queryable
устанавливается вызовом db.ObjectA.Where(...)
, который является IQueryable<ObjectA>
, но затем он также устанавливается вызовом db.ObjectA.First(...)
, которыйявляется ObjectA
; я предполагаю, что вы хотите IQueryable<ObjectA>
, поскольку более поздние коды ссылаются на queryable.Any(...)
), но вот мое предположение:
var days = DateHelper.EachDay( startDate, endDate );
var activeDaysIsLogicCorrectFlags = db.Operations
// get days that are "active"
.Where( op => op.IsActive && days.Contains( op.Day ) )
// join with ObjectA's to filter for active ObjectA's
// is there a nav property you could use instead?
// use GroupJoin for use with `Any(...)` in results
.GroupJoin( db.ObjectA, op => op.Day, oa => oa.Day, ( op, oaGroup ) => new
{
//Operation = op,
// projecting Operation.Day since that's what your foreach loop is using
Day = op.Day,
IsLogicACorrect = oaGroup.Any( oa => oa.ObjectACount == 5 ),
// if IsLogicBCorrect can be determined from the collection of ObjectA's:
//IsLogicBCorrect = oaGroup.Any( oa => oa.ObjectBCount == 3 ),
} );
Результатом является IQueryable
анонимного типа, которыйсопоставляет "активный" Operation.Day
с вашей логикой для IsLogicACorrect
.Для остальных ваших флагов IsLogicXCorrect
, если все они могут быть определены с помощью ObjecetA
group aoGroup
, просто добавьте их в селектор результатов GroupJoin
(как показано в закомментированном свойстве).Если эти флаги нуждаются в собственных группировках (например, для определения IsLogicBCorrect
необходимо использовать группу ObjectB
, затем добавьте дополнительные вызовы к GroupJoin
, как показано выше, но с использованием их соответствующих DbSet
и свойств. Например, если вам нужноиспользуйте db.ObjectB
для IsLogicBCorrect
:
var activeDaysIsLogicCorrectFlags =
<existing logic from above>
.GroupJoin( db.ObjectB, at => at.Day, ob => ob.Day, ( at, obGroup ) => new
{
// project all previous results
at.Day,
at.IsLogicACorrect,
// new flag
IsLogicBCorrecet = obGroup.Any( ob => ob.ObjectBCount == 3 ),
} );