从匿名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>();
}
只是返回一个匿名类型的对象的列表:
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;
}
大,的作品!尽管如此,我不禁想到还有比铸造更好的方法。 – mdvaldosta 2010-04-15 16:52:18
那么,你不能返回一个匿名类型的列表,一个'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;
正在研究所有与高级绑定相关的解决方案,并忽略了最简单的解决方案。这个为我解决了。谢谢 – djv 2014-03-28 18:42:01
我正在投影新的Student实例,因为......以及我并不真正知道自己在做什么(明显)。我可以很容易地从所有学生那里获得所有的信息,但是我只需要一些字段,并且在运行时填充datagrid视图,因为它是只读的。 – mdvaldosta 2010-04-15 16:48:09
感谢您的代码和课程。 – mdvaldosta 2010-04-15 17:02:00