返回LINQ查询的结果

时间:2016-08-19 13:07:41

标签: c# linq

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参数的构造函数

1 个答案:

答案 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 };但你不能这样做如果您没有原始情况下的默认构造函数,那么这就是