Используя динамический объект расширения в цикле для создания списка, ссылка обновляет все элементы - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь извлечь только определенные столбцы из таблицы, используя EF, с помощью

dynamic var = new ExpandoObject.

Конечная цель состоит в том, чтобы позволить пользователю выбрать поля, которые они хотят вернуть из API, ичтобы код извлекал только эти столбцы.

Моя проблема, скажем, на основе их данных, у них есть 100 записей, мой динамический объект является ссылкой, поэтому, когда я обновляю один элемент списка, они все обновляются.

Код:

dynamic expando = new ExpandoObject();
var output = new List<ExpandoObject>();

PopulateDynamicObject(expando); // adds the columns the user had marked to include

static dynamic PopulateDynamicObject(dynamic rootObject)
{
    var fields = GetLeadFields();

    foreach (var field in fields)
    {
        AddProperty(rootObject, field.FieldName, "");
    }

    return rootObject;
}

// get data from database. snip

// List all fields possible but UpdateProperty will only update properties which exist, therefore it honours PopulateDynamicObject
UpdateProperty(expando, "LeadId", dbLead.leadID);
UpdateProperty(expando, "CompanyId", dbLead.companyID);
UpdateProperty(expando, "CompanyName", dbLead.company);
UpdateProperty(expando, "UnitIdentity", dbLead.unitIdentity);
UpdateProperty(expando, "BadgeId", dbLead.badgeID);
UpdateProperty(expando, "ScanDate", dbLead.scanDate);
UpdateProperty(expando, "FirstName", dbLead.firstName);
UpdateProperty(expando, "LastName", dbLead.lastName);
UpdateProperty(expando, "Company", dbLead.company);
UpdateProperty(expando, "Address1", dbLead.address1);
UpdateProperty(expando, "Address2", dbLead.address2);
UpdateProperty(expando, "Address3", dbLead.address3);

static void UpdateProperty(ExpandoObject expando, string propertyName, object propertyValue = null)
{
    var expandoDict = expando as IDictionary<string, object>;

    if (expandoDict.ContainsKey(propertyName))
        expandoDict[propertyName] = propertyValue;
}

Но конечный результат состоит из n строк с одинаковыми данными.

...