2012-04-16 33 views
1

匿名型をカスタムクラスのObservableCollectionに変換するLINQ文の変換に苦労しています。LINQ文とクラス定義、問題私の匿名型とクラス自体の間でIQueryableインターフェイスをどのように実装するのかと関係しています。LINQ匿名型からカスタムクラスのObservableCollectionへ

public class CatSummary : INotifyPropertyChanged 
{ 
    private string _catName; 
    public string CatName 
    { 
     get { return _catName; } 
     set { if (_catName != value) { _catName = value; NotifyPropertyChanged("CatName"); } } 
    } 

    private string _catAmount; 
    public string CatAmount 
    { 
     get { return _catAmount; } 
     set { if (_catAmount != value) { _catAmount = value; NotifyPropertyChanged("CatAmount"); } } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    // Used to notify Silverlight that a property has changed. 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 

      //MessageBox.Show("NotifyPropertyChanged: " + propertyName); 

     } 
    } 

} 

private void GetCategoryAmounts() 
{ 
    var myOC = new ObservableCollection<CatSummary>(); 


    var myQuery = BoughtItemDB.BoughtItems 
         .GroupBy(item => item.ItemCategory) 
         .Select(g => new 
         { 
          _catName = g.Key, 
          _catAmount = g.Sum(x => x.ItemAmount) 
         }); 

    foreach (var item in myQuery) myOC.Add(item); 
} 

私は取得していますエラーは、私はC#と右方向を指す必要性に比較的新しいです最後の行にあると
"Argument 1: cannot convert from 'AnonymousType#1' to 'CatSummary'"

ある - 誰でもこの種の上の任意のチュートリアルを持っている場合助けてくれるもの

答えて

3

これは、作成する匿名オブジェクトにCatSummaryという型の関係がないためです。あなたのObservableCollectionにこれらの項目を追加したい場合は、CatSummaryそうのように構築する必要があります。

BoughtItemDB.BoughtItems.GroupBy(item => item.Category) 
     .Select(x => new CatSummary 
     { 
      CatName = x.Key, 
      CatAmount = x.Sum(amt => amt.ItemAmount) 
     }); 

この方法では、クエリがIEnumerable<CatSummary>代わりのIEnumerable<a'>作成します。他の言語やそのダックタイピングとは異なり、新しく作成された匿名オブジェクトにCatNameとCatAmountプロパティがあるということだけでは、実際のタイプに耐えることはできません。

+0

は仕事がうまくなかった、これが働くだろう、なぜ私が見ることができるコードをステップ実行します。どうもありがとう。 – MAO

+0

私は今WPFバインディングに苦労しています。カスタムクラスにXAMLオブジェクトをバインドする方法はありますか?私が持っているエラーは、 "BindingExpression path error" ... "プロパティが見つかりません"? – MAO

0

new { ...で匿名型を選択するのではなく、new CatSummary(...のCatSummaryインスタンスを選択できます(または、CatSummaryインスタンスを構築する他の方法が利用可能な場合)。

0

これを試してみてください:

foreach (var item in myQuery) 
{ 
    // You will need to create a new constructor 
    var catsummary = new CatSummary(item.CatName, item.CatAmount); 
    myOC.Add(catsummary); 
    } 
関連する問題