У меня есть IQueryable
, на котором я хочу выполнить Select
.В этом случае я создаю новый экземпляр объекта и запускаю функцию, которая копирует значения объекта из IQueryable (b) во вновь созданный объект (новый DTO) и затем возвращает этот экземпляр.
IQueryable.Select:
businessLayer.GetAll().Select( b => new DTO().InitInhertedProperties(b)).ToList();
Функция в DTO:
public DTO InitInhertedProperties(Base baseInstance)
{
return Utilities.InitInhertedProperties(this, baseInstance);
}
Функция для копирования:
public static T InitInhertedProperties<T,K>(T instance, K baseClassInstance) where T : K
{
foreach (PropertyInfo propertyInfo in baseClassInstance.GetType().GetProperties())
{
object value = propertyInfo.GetValue(baseClassInstance, null);
if (null != value) propertyInfo.SetValue(instance, value, null);
}
return instance;
}
Первый раз InitInhertedProperties
метод вызывается instance
- пустой объект, baseClassInstance
имеет значения, которые он должен иметь:
Результат первогоИтерация выглядит следующим образом:
Как видите: все работало так, как должно быть на первой итерации.Теперь вторая итерация.
Во второй раз, когда метод InitInhertedProperties
вызывается insatnce
, это не новый экземпляр, а один из первой итерации.baseClassInstance
- это именно то, что должно быть:
Результат второй итерации выглядит следующим образом:
Полученный список выглядит следующим образом:
Это происходит только при использовании IQueryable.Select
.При использовании List.Select
результат выглядит точно так же, как и ожидалось.
Это означает, что решение этой проблемы устранено.Но это просто обходной путь, а не решение.
businessLayer.GetAll().ToList().Select( b => new DTO().InitInhertedProperties(b)).ToList();