使用LINQ选择新建时的转换问题

时间:2011-12-30 21:37:30

标签: c# linq

我有以下代码:

    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属性?

1 个答案:

答案 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