Как l oop через свойства анонимного типа в списке - PullRequest
0 голосов
/ 20 июня 2020

Если у меня следующий запрос LINQ:

 var outstandingDataTotalData = from t1 in dtTotal.AsEnumerable()
                                                  join t2 in dtOutstandingData.AsEnumerable() on
                                                   new
                                                   {
                                                       priv_code = t1["priv_code"],
                                                       pri_ded = t1["pri_ded"].ToString().Trim()
                               
                                                   } equals
                                                     new
                                                     {
                                                         priv_code = t2["priv_code"],
                                                         pri_ded = t2["pri_ded"].ToString().Trim()
               
                                                     }
                                                   into ps
                                                   from t2 in ps.DefaultIfEmpty()
                                                   select new
                                                   {
                                                       adjustment_value = t2 == null ? string.Empty : t2["adjustment_value"].ToString(),
                                                       amount_outstanding = t2 == null ? string.Empty : t2["amount_outstanding"].ToString(),
                                                       amount_outstanding_priv = t2 == null ? string.Empty : t2["amount_outstanding_priv"].ToString(),
                                                       amount_outstanding_ded = t2 == null ? string.Empty : t2["amount_outstanding_ded"].ToString(),
                                                       diff_outstanding = t2 == null ? string.Empty : t2["diff_outstanding"].ToString(),
                                                       exchange_rate = t2 == null ? string.Empty : t2["exchange_rate"].ToString(),
                                                       SalYear = t2 == null ? string.Empty : t2["sal_year"].ToString(),
                                                       SalMonth = t2 == null ? string.Empty : t2["sal_mon"].ToString()
                                                   };

Теперь outstandingDataTotalData - это список анонимного типа. И у меня есть следующий класс:

 public class AdjustmentTotal
    {
        public string SalYear { get; set; }

        public string SalMonth { get; set; }

        public string Value { get; set; }
    }

How to l oop through outstandingDataTotalData properties to fill List<AdjustmentTotal> as the following example:

If the result set of outstandingDataTotalData =

[0]{ adjustment_value = "100.00", amount_outstanding = "80.00", amount_outstanding_priv = "60.00", amount_outstanding_ded = "30.52", diff_outstanding = "0.36", exchange_rate = "", SalYear = "2018", SalMonth = "1" }

[1]{ adjustment_value = "1500.00", amount_outstanding = "5040.00", amount_outstanding_priv = "", amount_outstanding_ded = "", diff_outstanding = "0.36", exchange_rate = "", SalYear = "2018", SalMonth = "1" }

Мне нужен набор результатов List<AdjustmentTotal> как:

2018  1   100.00
2018  1   1500.00
2018  1   80.00
2018  1   5040.00
2018  1   60.00
2018  1   
2018  1   30.52
2018  1   
2018  1   0.36
2018  1   0.36
2018  1
2018  1   

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Сделайте вашу жизнь проще, не выделяйте на отдельные свойства. Сделайте извлечение в виде массива:

select new {
  someArray = new[]{
    t2["adjustment_value"].ToString(),
    t2["amount_outstanding"].ToString(),       
    t2["amount_outstanding_priv"].ToString(),
    t2["amount_outstanding_ded"].ToString(),
    ...
  },
  SalYear = ...,

}

Таким образом, вы получите объект с 3 свойствами, двумя строками SalXxx и массивом строк (другие значения). Массив строк означает, что вы можете использовать LINQ SelectMany для его выравнивания. В примере с msdn вы увидите, что у них есть владельцы со списками домашних животных (переменное количество домашних животных, но ваши значения - фиксированное число), а после selectmany оно сведено к списку, где владелец повторяется и есть одно домашнее животное. Значения в нижнем регистре - это домашние животные, значения SalXxx - владельцы

Как только вы получите рабочий запрос, вы можете фактически интегрировать его в первый запрос ..

Извините за то, что не опубликовали полный пример ( и я пропустил нулевые проверки для ясности) - с кодом очень сложно работать на мобильном телефоне

Изменить:

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

var obj = new [] { 
        new { SalYear = 2018, SalMonth = 1, C = new[] { "av1", "ao1", "aop1", "aod1" } }, 
        new { SalYear = 2018, SalMonth = 2, C = new[] { "av2", "ao2", "aop2", "aod2" } }
    };

Будьте как av1, av2, ao1, ao2.., поэтому мы хотим чтобы отсортировать результаты сначала по индексу внутреннего массива, затем по индексу внешнего массива

Мы используем SelectMany, чтобы выкопать внутренний массив, а затем для каждого элемента во внутреннем массиве мы создаем новый объект, имеющий данные и индексы (внутреннего и внешнего):

obj.SelectMany((theOuter, outerIdx) =>
  theOuter.C.Select((theInner, innerIdx) => 
    new { 
      SalYear = theOuter.SalYear, 
      SalMonth = theOuter.SalMonth, 
      DataItem = theInner, 
      OuterIdx = outerIdx,
      InnerIdx = innerIdx
    }
  )
).OrderBy(newObj => newObj.InnerIdx).ThenBy(newObj => newObj.OuterIdx)

Вы, вероятно, обнаружите, что вам не нужны ThenBy; сортировка по InnerIdx оставит ie (каждый InnerIdx в моем списке представлен дважды - есть два innerIdx = 0 et c) и вещи в linq сортируют, насколько они не могут, а затем - потому что они отсортированы по OuterIdx уже (когда они вошли в запрос) они должны оставаться отсортированными по OuterIdx после того, как они t ie на InnerIdx .. Если это имеет смысл. Ремень и подтяжки!

1 голос
/ 20 июня 2020

Используйте eum:

    class Program
    {

        static void Main(string[] args)
        {


            List<AdjustmentTotal> totals = new List<AdjustmentTotal>();
            for (int i = 0; i < (int)VALUE.END; i++)
            {
                foreach (var data in outstandingDataTotalData)
                {
                    AdjustmentTotal total = new AdjustmentTotal();
                    totals.Add(total);
                    total.SalMonth = data.SalMonth;
                    total.SalYear = data.SalYear;
                    total._Type = (VALUE)i;
                    switch ((VALUE)i)
                    {
                        case VALUE.adjustment_value :
                            total.Value = data.adjustment_value;
                            break;
                        case VALUE.amount_outstanding:
                            total.Value = data.amount_outstanding;
                            break;
                        case VALUE.amount_outstanding_ded:
                            total.Value = data.mount_outstanding_ded;
                            break;
                        case VALUE.amount_outstanding_priv:
                            total.Value = data.amount_outstanding_priv;
                            break;
                        case VALUE.diff_outstanding:
                            total.Value = data.diff_outstanding;
                            break;
                        case VALUE.exchange_rate:
                            total.Value = data.exchange_rate;
                            break;
                    }
                }
            }
        }
    }
    public enum VALUE
    {
        adjustment_value = 0, 
        amount_outstanding = 1, 
        amount_outstanding_priv = 2, 
        amount_outstanding_ded = 3, 
        diff_outstanding = 4, 
        exchange_rate = 5,
        END = 6
    }    
    public class AdjustmentTotal
    {
        public string SalYear { get; set; }

        public string SalMonth { get; set; }

        public string Value { get; set; }

        public VALUE _Type { get; set; }
    }
1 голос
/ 20 июня 2020
outstandingDataTotalData.Select(s => new AdjustmentTotal {
    SalYear = s.SalYear,
    SalMonth = s.SalMonth,
    Value = s.adjustment_value
}).ToList();
...