LINQ - Как изменить выбор в зависимости от значения, которое возвращает БД

Я относительно новичок в Linq и разрабатываю с.NET функцию, которая создает экземпляр POCO с выбранными полями запроса linq.

Проблема в том, что одно из этих полей должно быть преобразовано "во время выполнения".

Это мой неисправный пример:

Private Shared Function GetInfectionHistory(HiveId As Long) As IList(Of HiveInfectionDetail)
    Using DB As LandDataModelUnitOfWork = Context.CreateUnitOfWork
            Dim historyResult = From I In DB.HiveAfbInfections
                                Where I.HiveId = HiveId
                                Select New HiveInfectionDetail With {
                                    .DateInfected = I.DateInfected,
                                    .DateCleaned = I.DateCleared,
                                    .PotentialAfbInfection = I.PotentialInfection,
                                    .AfbInfection = Not I.PotentialInfection
                                }
            If IsListEmpty(historyResult.ToList()) Then
                Return Nothing
            End If
            Return historyResult.ToList()
        End Using
End Function

а также

Private Shared Function IsListEmpty(Of T)(source As IEnumerable(Of T)) As Boolean
        If source Is Nothing Then
            Return True
        End If
        Return Not source.Any()
    End Function
enter code here

Проблемная строка - когда я присваиваю значение свойству AfbInfection. Это свойство будет противоположно значению PotentialInfection в базе данных. Так что, если I.PotentialInfection равен True, тогда мое свойство AfbInfection должно иметь значение False. Выполнение этого, как указано выше, вызовет исключение IndexOutOfRangeException - индекс находился за пределами массива, не уверенный в том, что LinQ делает с этим выражением NOT, но, конечно, это не то, что я хочу.

Есть ли способ изменить значение поля БД при сохранении его в мой пользовательский объект?

Спасибо!

1 ответ

Попробуй это:

Private Shared Function GetInfectionHistory(HiveId As Long) As IList(Of HiveInfectionDetail)
    Using DB As LandDataModelUnitOfWork = Context.CreateUnitOfWork
            Dim historyQuery1 = From I In DB.HiveAfbInfections
                                Where I.HiveId = HiveId
                                Select New With {
                                    .DateInfected = I.DateInfected,
                                    .DateCleaned = I.DateCleared,
                                    .PotentialInfection = I.PotentialInfection
                                }
            Dim historyQuery2 = From I In historyQuery1.ToArray()
                                Select New HiveInfectionDetail With {
                                    .DateInfected = I.DateInfected,
                                    .DateCleaned = I.DateCleaned,
                                    .PotentialAfbInfection = I.PotentialInfection,
                                    .AfbInfection = Not I.PotentialInfection
                                }
            Dim historyResult = historyQuery2.ToList()
            If IsListEmpty(historyResult) Then
                Return Nothing
            End If
            Return historyResult
        End Using
End Function
Другие вопросы по тегам