如何转换'System.Linq.IQueryable <System.Collections.Generic.List <Model.Record>到List <Record>

Arc*_*ian 2 c# ef-code-first entity-framework-5

如何检索模型中的列表?

这就是我正在尝试的:

private void cbxPlayers_SelectedValueChanged(object sender, EventArgs e)
        {
            List<Record> records = new List<Record>();
            string selectedPlayer = cbxPlayers.SelectedItem.ToString();
            using (ProgressRecordContext context = new ProgressRecordContext())
            {
                records = (from Player in context.Players
                          where Player.Name == selectedPlayer
                          select Player.Records).ToList<Record>();
            }
        }
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用,我错过了什么?

这些是他们需要的模型:

public class Player
    {
        [Key][DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int AccountNumberId { get; set; }

        public string Name { get; set; }

        public virtual List<Record> Records { get; set; }
    }

public class Record
    {
        public int RecordId { get; set; }
        public int AccountNumberId { get; set; }

        public double Level { get; set; }
        public int Economy { get; set; }
        public int Fleet { get; set; }
        public int Technology { get; set; }
        public int Experience { get; set; }

        public DateTime TimeStamp { get; set; }

        public virtual Player Player { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:这是错误消息:

错误1'System.Linq.IQueryable>'不包含'ToList'的定义和最佳扩展方法重载'System.Linq.ParallelEnumerable.ToList(System.Linq.ParallelQuery)'有一些无效的参数

错误2实例参数:无法从'System.Linq.IQueryable>'转换为'System.Linq.ParallelQuery'

编辑:

我看到我可能不太清楚我想要做什么.我最终找到了一种方法来做我想做的事情,这里是:

private void cbxPlayers_SelectedValueChanged(object sender, EventArgs e)
        {
            lstvRecords.Items.Clear();
            if(cbxPlayers.SelectedIndex == -1)
            {
                return;
            }
            string selectedPlayer = cbxPlayers.SelectedItem.ToString();
            using (ProgressRecordContext context = new ProgressRecordContext())
            {
                var records = from Player in context.Players
                          from Record in context.Records
                          where Player.Name == selectedPlayer &&
                          Player.AccountNumberId == Record.AccountNumberId
                          select new
                          {
                              Level = Record.Level,
                              Economy = Record.Economy,
                              Fleet = Record.Fleet,
                              Technology = Record.Technology,
                              Experience = Record.Experience,
                              TimeStamp = Record.TimeStamp
                          };

                foreach (var element in records)
                {
                    string[] elements = {element.Level.ToString(),
                                            element.Economy.ToString(),
                                            element.Fleet.ToString(),
                                            element.Technology.ToString(),
                                            element.Experience.ToString(),
                                            element.TimeStamp.ToString()
                                        };
                    ListViewItem lvi = new ListViewItem(elements);
                    lstvRecords.Items.Add(lvi);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来编写该查询,或者我的方式是否正确?

And*_*tan 6

不知道为什么你会得到ParallelQuery- 除非你using的源文件中有一些古怪的东西.

无论如何,你似乎有一个可枚举的枚举 - 尝试SelectMany(注意你需要using System.Linq;这个作为扩展方法):

records = (from Player in context.Players 
           where Player.Name == selectedPlayer 
           select Player.Records).SelectMany(r => r).ToList();
Run Code Online (Sandbox Code Playgroud)

另外 - 除非你打算添加/删除该列表,否则你应该只使用一个数组,即使用.ToArray().

正如@Tim S(+1)所指出的那样 - 如果你期望这里只有一个玩家,那么你应该用它SingleOrDefault()来获得单个玩家 - Records然后你将变成一个阵列/列表.