2016-08-19 5 views
2

LINQを初めて使用しましたが、これはかなり簡単です。LINQクエリの結果を返す

私はDBからの製品のレコードを引っ張っています:

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; 
    } 
} 

私はfunctioからこれらのリストを返そうとしていますn。現在の誤差があることである:

topProductはあなたのプロパティに値を設定するプロパティの初期化方法を使用しているので、それが失敗している理由がある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; 
    } 
} 

行ったように、あなたはそれを使用することができますオブジェクトを初期化しているときにコンストラクタ - ()(パラメータなし)をデフォルトのコンストラクタとして呼び出す場合は、()を使用します。これは、他のコンストラクタを作成していない場合に自動的に作成されます。 See here about constructors

私が誤解していない場合は、オブジェクトの初期化を使ってプロパティをインラインで初期化する機能が導入され、さまざまなオプションすべてに対してコンストラクタの大きな配列を作成する手間が省けます。そして、彼らも空()(あなたが呼び出しているコンストラクタは、デフォルトコンストラクタである場合には)を削除し、あなたが持っていると判明することができ有効

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 };しかし、それはのためだけの素敵な糖衣構文であります元のケースのようにデフォルトのコンストラクタがない場合は、これを行うことはできません。

+0

おい、いいね。私が言ったように、LINQの初心者ですから、()の代わりにいつ{{}を使用しますか? – TrevorGoodchild

+0

ありがとうGilad! – TrevorGoodchild

+2

@トレバー:これはLINQ固有の問題ではありません。基本的なC#の構文と、オブジェクトの初期化に使用する構文に応じてどのコンストラクタが呼び出されるかを理解しています。参照:[オブジェクト初期化ツールを使用してオブジェクトを初期化する方法](https://msdn.microsoft.com/en-us/library/bb397680.aspx) – sstan

関連する問題