Комплекс linq включай в EF6 - PullRequest
0 голосов
/ 20 июня 2019

Есть две сущности, например, job и solution .Каждый из них имеет поле date и поле level и поле Количества .

Необходимо объединить их так, чтобы онисначала сгруппированы по уровням, а затем по месяцам, и в то же время их количество необходимо суммировать.

Я пробовал разные варианты, но ничего не вышло.Основная проблема заключается в группировке по месяцам и суммировании чисел в прилагаемых листах.

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

Например:

var jobs = new List<Job>()
{
new Job { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 111 },
new Job { Level = 1, Date = new DateTime(2019, 1, 20), Quantity = 222 },
new Job { Level = 2, Date = new DateTime(2019, 2, 1), Quantity = 333 },
new Job { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 444 }
};

var solutions = new List<Solution>()
{
new Solution { Level = 1, Date = new DateTime(2019, 2, 1), Quantity = 555 },
new Solution { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 666 },
new Solution { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 777 },
new Solution { Level = 2, Date = new DateTime(2019, 1, 20), Quantity = 888 }
};

Выход:

  • Уровень 1 -> 1 января 2019 -> 1110 (111 + 222 + 777)
  • Уровень 1 -> 1 февраля 2019 г. -> 555
  • Уровень 2 -> 1 января 2019 г. -> 888
  • Уровень 2 -> 1 февраля 2019 г. -> 1443 (333 + 444 + 666)

и так далее.И да, все это в EF6.

Ответы [ 2 ]

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

Попробуйте следовать, который использует Concat. Я создаю класс для слияния. Это также можно сделать анонимно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication116
{
    class Program
    {
        static void Main(string[] args)
        {
            var jobs = new List<Job>()
            {
                new Job { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 111 },
                new Job { Level = 1, Date = new DateTime(2019, 1, 20), Quantity = 222 },
                new Job { Level = 2, Date = new DateTime(2019, 2, 1), Quantity = 333 },
                new Job { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 444 }
            };

            var solutions = new List<Solution>()
            {
                new Solution { Level = 1, Date = new DateTime(2019, 2, 1), Quantity = 555 },
                new Solution { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 666 },
                new Solution { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 777 },
                new Solution { Level = 2, Date = new DateTime(2019, 1, 20), Quantity = 888 }
            };


            List<LevelDateQuantity> concat = jobs.Select(x => new LevelDateQuantity() { Date = x.Date, Level = x.Level, Quantity = x.Quantity})
                .Concat( solutions.Select(x => new LevelDateQuantity() { Date = x.Date, Level = x.Level, Quantity = x.Quantity})).ToList();

            List<LevelDateQuantity> results = concat.OrderBy(x => x.Level).ThenBy(x => x.Date)
                .GroupBy(x => new { level = x.Level, date = new DateTime(x.Date.Year, x.Date.Month,1)})
                .Select(x => new LevelDateQuantity() { Level = x.Key.level, Date = x.Key.date, Quantity = x.Sum(y => y.Quantity)})
                .ToList();
        }

    }
    public class LevelDateQuantity
    {
        public int Level { get; set; }
        public DateTime Date { get; set; }
        public int Quantity { get; set; }
    }
    public class Job : LevelDateQuantity
    {
        public int Level { get; set; }
        public DateTime Date { get; set; }
        public int Quantity { get; set; }
    }
    public class Solution : LevelDateQuantity
    {
        public int Level { get; set; }
        public DateTime Date { get; set; }
        public int Quantity { get; set; }
    }
}
0 голосов
/ 21 июня 2019

Клятва, потому что мы не можем видеть вашу структуру класса poco, мы не знаем, являются ли эти две таблицы раздельными или имеют отношение один-ко-многим к основной таблице, поэтому с помощью предоставленного вами кода я сделаю это;

var jobs = new List<Job>()
{
new Job { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 111 },
new Job { Level = 1, Date = new DateTime(2019, 1, 20), Quantity = 222 },
new Job { Level = 2, Date = new DateTime(2019, 2, 1), Quantity = 333 },
new Job { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 444 }
};

var solutions = new List<Solution>()
{
new Solution { Level = 1, Date = new DateTime(2019, 2, 1), Quantity = 555 },
new Solution { Level = 2, Date = new DateTime(2019, 2, 20), Quantity = 666 },
new Solution { Level = 1, Date = new DateTime(2019, 1, 1), Quantity = 777 },
new Solution { Level = 2, Date = new DateTime(2019, 1, 20), Quantity = 888 }
};


foreach (var sol in solutions)
{
  var jb = new Job();
  jb.Level = sol.Level;
  jb.Date = sol.Date ;
  jb.Quantity= sol.Quantity;

   jobs.Add(jb);
}

 var result = Jobs.GroupBy(x=> new { x.Level, x.Date}).Select(x=> new 
 {
  level = x.Key.Level,
  date = x.Key.Date,
  sumQ = x.Sum(y => y.Quantity )
 });

Я не тестировал код и не записывал его в компилятор, поэтому могут быть некоторые ошибки, кроме того, что это должно решить вашу проблему.

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