2011-12-30 49 views
2

我有以下代码:投放问题

private void EntryBrowserLoad(object sender, EventArgs e) 
    { 
     var ase = new AprilShowersEntities(); 

     var q = 
      from d in ase.Entries 
      orderby d.EntryEndTime 
      select d; 

     var dateQuery = from d in q.AsEnumerable() 
         select new 
         { 
          d.EntryEndTime, 
          d.EntryId, 
          d.EntryPlainText, 
          d.EntryStartTime, 
          d.EntryText, 
          EntryHeader = GetEntry(d.EntryEndTime, d.EntryPlainText) 
         }; 

     lcEntries.DisplayMember = "EntryHeader"; 
     lcEntries.DataSource = dateQuery; 
    } 

    private void BtnOkClick(object sender, EventArgs e) 
    { 
     var q = (Entry) lcEntries.SelectedItem.Value; // Error here on this line 

     MessageBox.Show(q.EntryText); 
    } 

我的问题是其获得上面标线的错误,抱怨不能够把对象放回条目对象。我敢肯定,原因是因为我在我的LINQ查询中使用了select new。我的问题是,我如何读取返回的SelectedItem.Value对象的EntryText属性?

回答

6

您正投射到匿名类型中。要在编译时安全性和特性(如Intellisense)的其他地方(包含方法的上下文之外)引用结果,需要将其投影到具体类型中。如果你还没有这样的类,然后定义一个类来描述你的元素

class TheEntry { /* define properties */ } 

然后用您的查询

select new TheEntry 

选择到类,然后你可以转换到该类

var entry = (TheEntry)lcEntries.SelectedItem.Value; 

一旦开始传递查询结果或需要在其包含的方法之外访问它,通常最好定义一个适当的类型。但是,您也可以通过使用动态绑定或运行时绑定来在技术上绕过此操作。我不会推荐它,但它是一种可用的方法。

dynamic entry = lcEntries.SelectedItem.Value; 
MessageBox.Show(entry.EntryText); // no compile-time support, purely runtime