我有以下代码:
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);
}
我的问题是它在上面标记的行上出现错误,抱怨无法将对象强制转换回Entry对象。我确定原因是因为我在LINQ查询中使用select new
。我的问题是,如何读取返回的SelectedItem.Value对象的EntryText属性?
答案 0 :(得分: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