【问题标题】:How to Merge the List in Linq Query如何在 Linq Query 中合并列表
【发布时间】:2016-04-06 12:17:24
【问题描述】:

我有这个 Linq 查询,当我运行这些查询时,我得到了结果,我在下面的 img 中显示了

var SalesinvDets = (from si in CustomerTransactions
                            where si.TransTypeID == 10
                            group new {si} by new{
         month=si.Period==1?"Jan-2015":si.Period==2?"Feb-2015":si.Period==3?"Mar-2015":si.Period==4?"Apr-2015":si.Period==5?"May-2015":
                                si.Period==6?"Jun-2015":si.Period==7?"Jul-2015":si.Period==8?"Aug-2015":si.Period==9?"Sep-2015":si.Period==10?"Oct-2015":
                                si.Period==11?"Nov-2015":si.Period==12?"Dec-2015":"",   
        month2=si.Period==13?"Jan-2016":si.Period==14?"Feb-2016":si.Period==15?"Mar-2016":si.Period==16?"Apr-2016":si.Period==17?"May-2016":
                                si.Period==18?"Jun-2016":si.Period==19?"Jul-2016":si.Period==20?"Aug-2016":si.Period==21?"Sep-2016":
                                si.Period==22?"Oct-2016":si.Period==23?"Nov-2016":si.Period==24?"Dec-2016":"",
                            period=si.Period
                            } into g    
                            select new
                            {    
                                month=g.Key.month,
                                month2=g.Key.month2,
                                Amount = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight))//(si.OVAmount - (si.OVDiscount + si.OVFreight))
                            }).Dump();

我在运行查询期间得到了这个结果,但我不需要那样

我需要这样的结果,请帮助完成我的任务

【问题讨论】:

  • groupby 没有按照您想要的方式工作。我将使用 CompareTo() 方法向 IComparable 类添加一个继承。 Linq Groupby 将使用 CompareTo 方法进行分组。您有一个复杂的 GroupBy,并且将其编码为函数要容易得多。您还可以创建一个辅助函数来执行 Grouping,它等效于 CompareTo() 方法,该方法将返回一个整数 (-1 ,0,1)。

标签: c# entity-framework linq linq-to-sql linq-to-entities


【解决方案1】:

由于GroupBy 语句错误而存在问题,它基于si.Period 的值,它将是monthmonth2 中指定的值中的任何一个,因此在每个分组中monthmonth2 将是empty string "",两者都不会被填充,因此您显示的结果,相同的解决方案将是基于monthmonth2 的单独分组,如下:

var SalesinvDetsMonthList = (from si in CustomerTransactions
                            where si.TransTypeID == 10
                            group new {si} by new{
         month=si.Period==1?"Jan-2015":si.Period==2?"Feb-2015":si.Period==3?"Mar-2015":si.Period==4?"Apr-2015":si.Period==5?"May-2015":
                                si.Period==6?"Jun-2015":si.Period==7?"Jul-2015":si.Period==8?"Aug-2015":si.Period==9?"Sep-2015":si.Period==10?"Oct-2015":
                                si.Period==11?"Nov-2015":si.Period==12?"Dec-2015":"",   

                            period=si.Period
                            } into g    
                            select new
                            {    
                                Month=g.Key.month
                                Amount = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight))
                            }).Where( x => x.month != "").ToList(); // Removing empty month values / default values


var SalesinvDetsMonth2List = (from si in CustomerTransactions
                            where si.TransTypeID == 10
                            group new {si} by new{
         month2=si.Period==13?"Jan-2016":si.Period==14?"Feb-2016":si.Period==15?"Mar-2016":si.Period==16?"Apr-2016":si.Period==17?"May-2016":
                                si.Period==18?"Jun-2016":si.Period==19?"Jul-2016":si.Period==20?"Aug-2016":si.Period==21?"Sep-2016":
                                si.Period==22?"Oct-2016":si.Period==23?"Nov-2016":si.Period==24?"Dec-2016":"",
                            period=si.Period
                            } into g    
                            select new
                            {    
                                month=g.Key.month,
                                Month2=g.Key.month2,
                                Amount2 = g.Sum(x=>x.si.OVAmount)//.Sum(x=>x.si.OVAmount-(x.si.OVDiscount+x.si.OVFreight))//(si.OVAmount - (si.OVDiscount + si.OVFreight))
                            }).Where( x => x.month != "").ToList(); // Removing empty month values / default values

现在我们需要合并上面创建的两个列表:

SalesinvDetsMonthList, SalesinvDetsMonth2List

我假设它们有相同数量的记录,现在您需要一个组合实体,例如:

public class SalesinvDetsMonthCombined
{
  public string Month {get; set;}
  public string Month2 {get; set;}
  public int Amount {get; set;}
  public int Amount2 {get; set;}
}

int totalCount = SalesinvDetsMonthList.Count;

List<SalesinvDetsMonthCombined> result = new List<SalesinvDetsMonthCombined>();

for (int index=0, index < totalCount; index ++)
{
  result.Add(new SalesinvDetsMonthCombined
                ( Month = SalesinvDetsMonthList[index].Month,
                  Month2 = SalesinvDetsMonth2List[index].Month2,
                  Amount = SalesinvDetsMonthList[index].Amount,
                  Amount2 = SalesinvDetsMonth2List[index].Amount2
                ));
}

但是请注意,上面的代码是基于你提供的假设,有匹配的记录,如果记录的数量有差异,那么你需要添加一个默认值,否则它会失败

【讨论】:

  • int totalCount = SalesinvDetsMonth.Count;列表 结果 = 新列表(); for (int index=0, index
  • 错误是什么,索引超出范围?正如我所建议的那样,解决方案的成功取决于两个列表具有相同数量的记录,否则您需要一个默认值,还需要对代码进行少量编辑,检查一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多