LINQ的新手,但这应该相当简单。
我正从数据库中提取产品记录集:
ReportData= topProductsController.GetWowDetails(CurrentUser.UserId, _companyGroupCode, sector, year, string.Empty, string.Empty, string.Empty);
从该记录集中我试图按产品ID和计数对结果进行分组:
var productCounts = (from record in wowReportData
group record by record.ProductID into grouping
select new topProduct { Name = grouping.Key, quantity = grouping.Count() });
这是我要回归的课程:
public class topProduct
{
public int quantity { get; set; }
public string Name { get; set; }
public topProduct(string productDesc, int downloadCount)
{
this.Name = productDesc;
this.quantity = downloadCount;
}
}
我正在尝试从函数中返回这些列表。目前的错误是:
topProduct不包含带0参数的构造函数
答案 0 :(得分:3)
它失败的原因是因为您使用属性初始化方法为属性设置值,并且至少以您调用它的方式(new topProduct {...
)它将首先使用默认构造函数初始化对象。但是你没有。
更改为:
var productCounts = (from record in wowReportData
group record by record.ProductID into grouping
select new topProduct(grouping.Key, grouping.Count()));
或添加一个默认构造函数(这就是我要做的),然后就可以像你一样使用它
public class topProduct
{
public int quantity { get; set; }
public string Name { get; set; }
//default constructor
public topProduct() {}
public topProduct(string productDesc, int downloadCount)
{
this.Name = productDesc;
this.quantity = downloadCount;
}
}
使用()
if用于初始化对象并调用构造函数时 - ()
是默认构造函数(没有参数)。如果您尚未创建任何其他构造函数,则会自动创建此文件。 See here about constructors
现在在C#3.5中,如果我没有误会,他们引入了初始化对象初始化内联属性的能力,从而为您节省了为所有不同选项创建大量构造函数的痛苦。但这只是一个很好的语法糖:
var obj = new Class() { Prop1 = "a", Prop2 = 2 };
||
var obj = new Class();
obj.Prop1 = "a";
obj.Prop2 = 2;
然后他们甚至允许你删除空的()
(如果你调用的构造函数是默认的构造函数),你得到:var obj = new Class { Prop1 = "a", Prop2 = 2 };
但你不能这样做如果您没有原始情况下的默认构造函数,那么这就是