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

Ice*_*ind 2 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);
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是它在上面标记的行上出现错误,抱怨无法将对象强制转换回Entry对象.我确定,原因是因为我select new在LINQ查询中使用.我的问题是,如何读取返回的SelectedItem.Value对象的EntryText属性?

Ant*_*ram 6

您正在投射到匿名类型.要使用编译时安全性和Intellisense等功能在其他地方(在包含方法的上下文之外)引用结果,您需要投影到具体类型.如果您还没有这样的类,那么定义一个描述您的元素的类

class TheEntry { /* define properties */ }
Run Code Online (Sandbox Code Playgroud)

然后使用您的查询选择进入该类

select new TheEntry 
Run Code Online (Sandbox Code Playgroud)

然后你可以演绎到那个班级

var entry = (TheEntry)lcEntries.SelectedItem.Value;
Run Code Online (Sandbox Code Playgroud)

一旦开始传递查询结果或需要在其包含方法之外访问它,通常首选定义正确的类型.但是,您也可以通过使用动态或运行时绑定在技术上绕过这一点.我不推荐它,但它是一种可行的方法.

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