从匿名Linq查询填充WinForms DataGridView

mdv*_*sta 9 c# linq datagridview linq-to-sql winforms

//来自我的表格

BindingSource bs = new BindingSource();

private void fillStudentGrid()
{
     bs.DataSource = Admin.GetStudents();
     dgViewStudents.DataSource = bs;
}
Run Code Online (Sandbox Code Playgroud)

//来自Admin类

public static List<Student> GetStudents()

{
    DojoDBDataContext conn = new DojoDBDataContext();

    var query =
        (from s in conn.Students
         select new Student
         {
             ID = s.ID,
             FirstName = s.FirstName,
             LastName = s.LastName,
             Belt = s.Belt
         }).ToList();

    return query;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在Winforms中填充datagridview控件,我只想要一些值.代码编译,但会引发运行时错误:

不允许在查询中显式构造实体类型"DojoManagement.Student".

有没有办法让它以这种方式工作?

And*_*are 5

您已经有一个IEnumerable<Student>实例,并且由于此处描述的原因,您无法从查询中投影实体)

您也不需要创建一个列表来绑定到此数据源 - 您可以通过将其更改为此方法来大大简化您的方法:

public static IEnumerable<Student> GetStudents()
{
    return new DojoDBDataContext().Students;
}
Run Code Online (Sandbox Code Playgroud)

没有理由将新实例投影到只映射一些属性,通过执行查询无论如何返回所有值,并且您的投影不会保存任何内容.如果您确实只想从信息隐藏中返回此查询中的一些值,则可以执行以下操作:

public static IEnumerable<Object> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    return conn.Students
               .Select(s => new {
                   ID = s.ID,
                   FirstName = s.FirstName,
                   LastName = s.LastName,
                   Belt = s.Belt 
               });
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您没有使用C#4,则必须明确地转换为IEnumerable<T>to 的内容Object.只有C#4支持协方差IEnumerable<T>.因此,如果您使用的是C#3,则必须执行以下操作:

public static IEnumerable<Object> GetStudents()
{
    DojoDBDataContext conn = new DojoDBDataContext();

    return conn.Students
               .Select(s => new {
                   ID = s.ID,
                   FirstName = s.FirstName,
                   LastName = s.LastName,
                   Belt = s.Belt 
               }).Cast<Object>();
}
Run Code Online (Sandbox Code Playgroud)