参数无效 - 无法转换匿名类型#2

时间:2011-12-17 11:57:49

标签: c# linq

我正在尝试对列表进行小计,其中某些列需要求和或求平均值,而其他列则不需要进行小量化,例如:股票名称。

我收到错误

  

“最好的重载方法匹配   'System.Collections.Generic.List.Add(AnonymousType#1)'   有一些无效的参数参数'1':无法转换   'AnonymousType#2'到'AnonymousType#1'“

在Sage 200 Query Builder中运行时,无法看到我做错了什么。

如果我在Linqpad中尝试它,它会告诉我“当前上下文中不存在名称'cxt'”

有什么想法吗?谢谢!


var q = from d in cxt.K3_StockProfitMarginByCustomers
select new
{
    d.CustomerAccountName,
    d.CustomerAccountNumber,
    d.Code,
    d.Name,
    d.Profit,
    d.QuantitySold,
    d.TotalCost,
    d.TotalRevenue,
    d.MARGIN,
    d.SLCustomerAccountID,
    d.SOPOrderReturnID,
    d.SOPOrderReturnLineID
};

q = q.Distinct();

var l = q.ToList();
var summary = new 
{ 
   CustomerAccountName = "",
   CustomerAccountNumber = "",
   Code = "",
   Name = "", 
   Profit = (Decimal)q.Sum(o => o.Profit),
   QuantitySold = (Decimal)q.Sum(o => o.QuantitySold),
   TotalCost= (Decimal)q.Sum(o => o.TotalCost),
   TotalRevenue= (Decimal)q.Sum(o => o.TotalRevenue),
   MARGIN = (Decimal)q.Average(o => o.MARGIN),
   SLCustomerAccountID=(String)"",
   SOPOrderReturnID=(String)"",
   SOPOrderReturnLineID=(String)""
};

l.Add(summary);

return l.AsQueryable();

2 个答案:

答案 0 :(得分:3)

问题在于您的收藏。

var q = from d in cxt.K3_StockProfitMarginByCustomers

select new
{
d.CustomerAccountName,
d.CustomerAccountNumber,
d.Code,
d.Name,
d.Profit,
d.QuantitySold,
d.TotalCost,
d.TotalRevenue,
d.MARGIN,
d.SLCustomerAccountID,
d.SOPOrderReturnID,
d.SOPOrderReturnLineID
};

这会将匿名类型对象创建为可以使用的

q = q.Distinct();
var l = q.ToList();

它创建匿名类型#1

的集合

现在,您的代码初始化另一个匿名类型的对象摘要,因为无法识别它与第一个查询中创建的相同,因此它将摘要创建为匿名类型#2。现在,您将其添加到第一个类型集合l,这会导致错误。

解决方案: 创建包含所有属性的强类型类并使用

首先查询并获取摘要。

选择新的你的类{    //所有财产 }

//创建集合 var summary = new yourclass(){//分配propery} //将摘要添加到集合中。

这将解决您的问题。

这是完整的例子

// Create new CS file with Name MyClass
public class MyClass
{
  public string CustomerAccountName {get; set;},
    public string CustomerAccountNumber {get; set;},
      public string Code {get; set;},
      public string Name {get; set;},
      public string Profit {get; set;},
      public int QuantitySold {get; set;},
    public double  TotalCost {get; set;},
    public double TotalRevenue {get; set;},
    public double MARGIN {get; set;},
    public int SLCustomerAccountID {get; set;},
    public int SOPOrderReturnID {get; set;},
    public int SOPOrderReturnLineID {get; set;}
}


//
var q = from d in cxt.K3_StockProfitMarginByCustomers
select new MyClass()
{
   CustomerAccountName= d.CustomerAccountName,
   CustomerAccountNumber = d.CustomerAccountNumber,
   Code = d.Code,
   Name = d.Name,
   Profile = d.Profit,
   QuantitySold= d.QuantitySold,
   TotalCost = d.TotalCost,
   TotalRevenue= d.TotalRevenue,
   MARGIN = d.MARGIN,
   SLCustomerAccountID= d.SLCustomerAccountID,
   SOPOrderReturnID= d.SOPOrderReturnID,
   SOPOrderReturnLineID= d.SOPOrderReturnLineID
};

q = q.Distinct();

var l = q.ToList();
var summary = new MyClass()
{ 
   CustomerAccountName = "",
   CustomerAccountNumber = "",
   Code = "",
   Name = "", 
   Profit = (Decimal)q.Sum(o => o.Profit),
   QuantitySold = (Decimal)q.Sum(o => o.QuantitySold),
   TotalCost= (Decimal)q.Sum(o => o.TotalCost),
   TotalRevenue= (Decimal)q.Sum(o => o.TotalRevenue),
   MARGIN = (Decimal)q.Average(o => o.MARGIN),
   SLCustomerAccountID=(String)"",
   SOPOrderReturnID=(String)"",
   SOPOrderReturnLineID=(String)""
};

l.Add(summary);

return l.AsQueryable();

答案 1 :(得分:2)

两个匿名类型不一样。属性可能具有相同的名称,但可能不是相同的类型,它们大多数都具有相同的类型。

您应该考虑创建自己的类并使用它。