解决办法就是采用List类型:
ListmytestData mydata = new ListmytestData();
先来看一个linq表达式的简单例子:
protected void Page_Load(object sender, EventArgs e) { //定义测试验证数据 ListmytestData mydata = new ListmytestData(); mydata.Add(new mytestData(1, "george", 23)); mydata.Add(new mytestData(2, "lio", 25)); mydata.Add(new mytestData(3, "kaiwen", 20)); mydata.Add(new mytestData(4, "anna", 19)); mydata.Add(new mytestData(5, "angel", 16)); mydata.Add(new mytestData(6, "geo", 27)); mydata.Add(new mytestData(7, "demo", 30)); mydata.Add(new mytestData(8, "哈哈", 22)); //1.最简单的实现linq表达式 IEnumerablemytestData matchs; matchs = from student in mydata //student是查询mydata集合中的对象的假名 where student.age20 //查询过滤条件 select student; //查询返回满足过滤条件的matchs的集合 //页面绑定数据展示 GridView1.DataSource = matchs; GridView1.DataBind(); }
调试查看返回的匹配的数据类型:
页面效果:
刚才我们对LinQ表达式应该有了初步的认识,现在在结合一些例子说明linQ表达式能够实现的几个效果:
投影:其实简单的说就是select语句支持一些数据类型和字符串数据操作,甚至可以动态定义一个新类返回信息,跟我们之前的sql语句中select语句有一部分类似,linQ表达式可以将查询返回的数据,支持一些操作返回为我们预期的类型,字符串或是动态新建的类。
但是对于一般值类型操作和自定义返回对象的投影在表达式上还是存在一些差别,现在一个例子做一个演示:
//2、投影--值类型 //注意:这里的IEnumerablestring中已经将matchs申明为了string类型,说明返回的是string的迭代对象 IEnumerablestring matchs; matchs = from student in mydata //student是查询mydata集合中的对象的假名 where student.age 20 //查询过滤条件 select student.name + "添加的字符"; //查询返回满足过滤条件的matchs的集合 //页面绑定数据展示 GridView1.DataSource = matchs; GridView1.DataBind();
//2、投影--对象类型 //注意:这里的IEnumerablestring中已经将matchs申明为了string类型,说明返回的是string的迭代对象 //IEnumerablestring matchs; var matchs = from student in mydata //student是查询mydata集合中的对象的假名 where student.age 20 //查询过滤条件 //这里的new{}是隐式创建的类对象,没有既定的类型,所以无法通过IEnumerable类别名 matchs //来匹配返回的迭代类对象,但是可以通过Var或者在先定义预期返回对象的类型 select new { id=student.studentid,name=student.name,age=student.age}; //页面绑定数据展示 GridView1.DataSource = matchs; GridView1.DataBind();
过滤和排序:比较有特色的一点就是where语句中可以同SQL语法中的逻辑表达式和多个条件表达式都适用,最特别的是由于是在C#源代码环境中所以我们可以调用自己自定一的方法如 where myfunction(类对象属性值)
//3 过滤和排序 IEnumerablemytestData matchs; matchs = from student in mydata //student是查询mydata集合中的对象的假名 where student.age 20 //查询过滤条件 orderby student.age //排序 select student; //页面绑定数据展示 GridView1.DataSource = matchs; GridView1.DataBind();
分组和聚合:如果对返回数据进行分组则返回的是分组对象的IEnumerableT集合,每个组实现IGroupingT,k接口,首先我们需要确定分组条件,其次需要确定每个组需要返回什么信息。
//3 分组和聚合 var matchs = from student in mydata //student是查询mydata集合中的对象的假名 where student.age 20 //查询过滤条件 orderby student.age //排序 group student by student.age into g //g是一个迭代IGoupingT,K对象,每个组又是IEnumerablemytestData对象 select new { age = g.Key, avergeage = g.Average(student = student.age) }; //页面绑定数据展示 GridView1.DataSource = matchs; GridView1.DataBind();