【问题标题】:Complex linq join in EF6EF6 中的复杂 linq 连接
【发布时间】:2019-06-20 14:48:11
【问题描述】:

有两个实体,例如 jobsolution。 他们每个人都有一个date字段和一个level字段和一个quantity字段。

需要将它们组合起来,先按级别分组,然后按月份分组,同时还要对它们的数量进行汇总。

我尝试了不同的选项,但没有任何结果。主要问题是按 分组,并对随附表格中的数字求和。

也就是说,输出应该是一串求和的数字,按级别分组,然后按月份分组。

例如:

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 级 -> 2019 年 1 月 1 日 -> 1110 (111 + 222 + 777)
  • 1 级 -> 2019 年 2 月 1 日 -> 555
  • 2 级 -> 2019 年 1 月 1 日 -> 888
  • 2 级 -> 2019 年 2 月 1 日 -> 1443 (333 + 444 + 666)

等等。是的,这一切都在 EF6 中。

【问题讨论】:

  • 发布一些代码以了解您迄今为止尝试过的内容,以便其他人可以帮助您编写代码并了解它的问题
  • 请至少发布数据结构和更真实的输入和输出。 2/1/2018 是 2 月 1 日还是 1 月 2 日?添加一个包含输入的列表并评论预期的输出
  • 也许这个例子可以帮助你: var aList = jobs.Select(x => new Tuple(x.Level, x.Date, x.Quantity)) ; var bList = solutions.Select(x => new Tuple(x.Level, x.Date, x.Quantity)); var groupedList = aList.Union(bList).GroupBy(x => new { x.Item2, x.Item1 }).Select(x => new { Date = x.Key.Item2, Sum = x.Sum(y = > y.Item3) }); var orderedList = groupedList.OrderBy(x => x.Date);

标签: c# .net linq entity-framework-6


【解决方案1】:

尝试以下使用 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; }
    }
}

【讨论】:

    【解决方案2】:

    誓言,因为我们看不到你的 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 )
     });
    

    我没有测试代码,也没有在编译器中写入,因此可能存在一些类型错误,除此之外这应该可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2015-07-14
      相关资源
      最近更新 更多