Цикл сбора и объединения - PullRequest
0 голосов
/ 11 марта 2020

Я хочу l oop через коллекцию, но вместо того, чтобы вручную использовать свойство Collection.property, например CompRes.PartNo1, CompRes.PartNo2, CompRes.Part3 et c и CompRes.Qty1, CompRes.Qty2. Я хочу получить его динамически. Поэтому я использую for-l oop, так как есть 12 частей и кол-во. Пожалуйста, как я могу добиться этого, используя for-l oop и конкатенацию, или если есть лучший способ добиться этого. См. БД и запрос ниже: enter image description here

var CompRes = _context.Fleetparts
    .Where(p => (p.FleetModelId == item.FleetmodelId && p.MotivePowerId == item.MotivePowerId
    && p.EngineTypeId == item.EngineTypeId && p.ServiceType == sty.ToString())).FirstOrDefault();


if (CompRes != null)
{
    for (int p = 1; p <= 12; p++)
    {
       var cpartId = string.Format("{0}.{1}{2}", CompRes, "PartNo",p); //CompRes.PartNo1
       var cpartQty = string.Format("{0}.{1}{2}",CompRes, "Qty",p);//CompRes.Qty1
        MrpCreateViewModel model1 = new MrpCreateViewModel
            {
                FltNo = _fleetService.GetById(item.Id).Fltno,
                LocationName = _locationService.GetById(item.LocationId).LocationName,
                FleetModelName = _fleetmodelService.GetById(item.FleetmodelId).ModelName,
                EngineName = _engineTypeService.GetById(item.EngineTypeId).EngineName,
                ServiceType = sty.ToString(),
                ServiceSequence = nsvr,
                EstimatehrPerDay = item.EstimateHrperDay,
                PartNo = _partService.GetById(int.Parse(cpartId.ToString())).PartNo,
                PartName = _partService.GetById(int.Parse(cpartId.ToString())).PartName,
                CostperUnit = _partService.GetById(int.Parse(cpartId.ToString())).CostUOM,

                QtyPerService = int.Parse(cpartQty.ToString()),
                TotalCost = (_partService.GetById(int.Parse(cpartId.ToString())).CostUOM * int.Parse(cpartQty.ToString()))
            };
        MyList.Add(model1);
    }
}

1 Ответ

0 голосов
/ 11 марта 2020

Вы можете использовать рефлексию, чтобы делать подобные вещи. Вот пример, который возвращает перечисляемый набор кортежей, который содержит имя и значение свойства:

public IEnumerable<(string propertyName, TProperty value)> GetAllParts<TProperty>(
    object input, string prefix)
{
    // Get all the properties that start with 'prefix'
    var properties = input
        .GetType()
        .GetProperties()
        .Where(p => p.Name.StartsWith(prefix))
        .ToArray();

    foreach (var property in properties)
    {
        // Return the property name and the value
        yield return ($"{property.Name}", (TProperty)property.GetValue(input));
    }
}

Чтобы использовать его, давайте создадим такой класс:

public class MyThing
{
    public int IntProperty1 { get; set; }
    public int IntProperty2 { get; set; }
    public int IntProperty3 { get; set; }
    public int IntProperty4 { get; set; }
    public int IntProperty5 { get; set; }

    public string StringProperty1 { get; set; }
    public string StringProperty2 { get; set; }
    public string StringProperty3 { get; set; }
    public string StringProperty4 { get; set; }
    public string StringProperty5 { get; set; }
}

Создайте экземпляр об этом:

var thing = new MyThing
{
    IntProperty1 = 1,
    IntProperty2 = 2,
    IntProperty3 = 3,
    IntProperty4 = 4,
    IntProperty5 = 5,
    StringProperty1 = "Value1",
    StringProperty2 = "Value2",
    StringProperty3 = "Value3",
    StringProperty4 = "Value4",
    StringProperty5 = "Value5"
};

И, наконец, получите нужные нам значения:

var intValues = GetAllParts<int>(thing, "IntProperty");
var stringValues = GetAllParts<string>(thing, "StringProperty");

И вы можете использовать такие результаты, например:

foreach (var (propertyName, value) in intValues)
{
    Console.WriteLine($"Property {propertyName} has a value of {value}");
}

Примечание : Похоже, что вы используете Entity Framework, если так, EF не может использовать подобные методы, поэтому вам нужно извлечь данные из базы данных в локальную память и затем вызвать эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...