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