一个表route记录了某个IP地址各个时段的下行速率、下载、上传总字节等信息,想要查询反回所有IP地址下行速率为最大时那行数据,写了以下代码,反回是正确的。但是这样写法总感觉不是好的写法,想请高人指导一下,给个更优化的代码。
 DataTable dt = dataSet.Tables["route"];
            var query = (from row in dt.AsEnumerable() select new { rowIpAdess = row.Field<string>("IP地址") }).Distinct();            foreach (var row in query)
            {                List<DataRow> drs = (from d in dt.AsEnumerable()                                     where d["下行速率"].ToString() == (from f in dt.AsEnumerable()
                                                                    where f["IP地址"].ToString() == row.rowIpAdess.ToString()
                                                                    select f).Max(p => p["下行速率"]).ToString()
                                     select d).ToList();
            }

解决方案 »

  1.   

    最优化的写法是用sql 不用linq!
      

  2.   


    DataTable 里边可以编译 sql?
      

  3.   

    学习 Linq 的例子可以看这个页面:http://msdn.microsoft.com/en-us/vcsharp/aa336746
      

  4.   

    使用一行Linq语句,需要分组。例如上面101 Samples中的《Max - Elements》例子(扫了一下,可能差不多)。
    另外,我有个“怪癖”,就是非常不爱看到随便写“.ToString()”代码的程序。如果你知道一个object变量是string类型的,那么就直接转换其类型,例如写  (string)row["abc"]。调用一个对象的.ToString()函数跟强制转换为string,是完全不同的概念,得到的结果也不尽相同。
      

  5.   

    1楼的代码还是有问题的,最后改成这样。
     var query = (from row in dt.AsEnumerable() select new { rowIpAdess = row.Field<string>("IP地址") }).Distinct();                     foreach (var row in query)
                {
               
                    DataRow[] dr = dataSet1.Tables["routestata"].Select("IP地址='" + row.rowIpAdess.ToString() + "'");                object max = dr.Max(p => p["下行速率"]);                object d = dr.Where(p => p["下行速率"]==max);
    }