2012-04-16 42 views
1

我正在努力將LINQ語句轉換爲具有自定義類的ObservableCollection,我很滿意LINQ語句和類定義,問題(I認爲)是關於我如何在我的匿名類型和類本身之間實現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); 
} 

我得到的錯誤是在最後一行是
"Argument 1: cannot convert from 'AnonymousType#1' to 'CatSummary'"

我是比較新的C#和在正確的方向需要指出 - 如果任何人有任何這類教程這也會有所幫助。

回答

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 2012-04-16 22:11:11

+0

我現在正在努力與WPF綁定,我如何將XAML對象綁定到我的自定義類?我遇到的錯誤是「BindingExpression path error」...「property not found on」? – MAO 2012-04-16 22:37:34

0

您可以使用new CatSummary(...(或使用任何其他構造CatSummary實例的方法供您選擇)選擇一個CatSummary實例,而不是選擇具有new { ...的匿名類型。

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