我正在尝试对列表进行小计,其中某些列需要求和或求平均值,而其他列则不需要进行小量化,例如:股票名称。
我收到错误
“最好的重载方法匹配 '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();
答案 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)
两个匿名类型不一样。属性可能具有相同的名称,但可能不是相同的类型,它们大多数都具有相同的类型。
您应该考虑创建自己的类并使用它。