繁体   English   中英

复杂的Linq加入EF6

[英]Complex linq join in EF6

有两个实体,例如jobsolution 它们每个都有一个日期字段,一个级别字段和一个数量字段。

有必要将它们组合起来,以便它们首先按级别分组,然后按月分组,同时,必须对它们的数量求和。

我尝试了不同的选择,但是什么也没有。 主要的问题是按月份分组并汇总所附表格中的数字。

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

例如:

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中。

尝试按照下面的方法使用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; }
    }
}

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

我没有测试过代码,也没有在编译器中编写过代码,所以除了可能解决您的问题之外,还可能存在一些类型错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM