从匿名Linq查询填充WinForms DataGridView

从匿名Linq查询填充WinForms DataGridView

问题描述:

//来自我的表单从匿名Linq查询填充WinForms DataGridView

BindingSource bs = new BindingSource(); 

private void fillStudentGrid() 
{ 
    bs.DataSource = Admin.GetStudents(); 
    dgViewStudents.DataSource = bs; 
} 

//来自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; 
} 

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

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

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

你已经有一个IEnumerable<Student>实例,你不能从原因描述here)查询

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

public static IEnumerable<Student> GetStudents() 
{ 
    return new DojoDBDataContext().Students; 
} 

没有理由将新实例投影到只映射一些属性,通过执行查询来返回所有值,并且投影不会为您节省任何东西。如果你真的想只从这个查询的信息的目的,返回几个值躲在你可以这样做:

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 
       }); 
} 

编辑:如果你不使用C#4你将不得不投的内容明确地将IEnumerable<T>改为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>(); 
} 
+0

我正在投影新的Student实例,因为......以及我并不真正知道自己在做什么(明显)。我可以很容易地从所有学生那里获得所有的信息,但是我只需要一些字段,并且在运行时填充datagrid视图,因为它是只读的。 – mdvaldosta 2010-04-15 16:48:09

+0

感谢您的代码和课程。 – mdvaldosta 2010-04-15 17:02:00

只是返回一个匿名类型的对象的列表:

public static List<object> GetStudents() 
{ 
    DojoDBDataContext conn = new DojoDBDataContext(); 

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

    return query; 
} 
+0

大,的作品!尽管如此,我不禁想到还有比铸造更好的方法。 – mdvaldosta 2010-04-15 16:52:18

+0

那么,你不能返回一个匿名类型的列表,一个'List '不能被分配给一个对象列表......所以你必须施放。无论如何,最好从GetStudents返回真实的Student对象,并且只在分配数据源之前执行投影 – 2010-04-15 17:19:13

一旦我四处寻找解决方案以在GridView上显示结果, 我遇到的问题是我忘了在Winform中将datagrid的属性设置为None:“Data Source”。

这是显示GridView的简单的解决方案使用LINQ(只是示例代码)

DataGrid dataGrid1 = new DataGrid(); 

var custQuery = 
    from cust in db.Customers 
    select cust; 

dataGrid1.DataSource = custQuery; 
+0

正在研究所有与高级绑定相关的解决方案,并忽略了最简单的解决方案。这个为我解决了。谢谢 – djv 2014-03-28 18:42:01