2009-07-01 61 views
2

我有一个像排序和唯一的记录Linq中

public DataTable functiongettable() 
{ 
     DataTable dt = new DataTable(); 

     dt.Columns.Add("Name"); 
     dt.Rows.Add("Name1"); 
     dt.Rows.Add("Name5"); 
     dt.Rows.Add("Name6"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name6"); 
     dt.Rows.Add("Name3"); 
     dt.Rows.Add("Name5"); 
     dt.Rows.Add("Name5"); 

     return dt; 
} 

DataTable中使用LINQ查询我想执行排序,需要独特的记录。

我做这样的

var query = from c in functiongettable().AsEnumerable().OrderBy("Name").Distinct() select c; 

但得到错误:

的类型参数的方法“System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func) '不能从使用中推断出来。尝试明确指定类型参数。

如何解决这个问题?

在此先感谢

回答

2

尝试指定在鲜明声明DataRowComparer.Default

UPDATE:

并使用row.Field( “名称”)再次进行排序

UPDATE时:

var query = (from c in functiongettable().AsEnumerable() 
      orderby c.Field<string>("Name") 
      select c).Distinc(DataRowComparer.Default); 
1

你需要一个委托传递给OrderBy,不一个string

试试这个:

 var query = dt.AsEnumerable() 
      .OrderBy(dr => dr.ItemArray[0] as string) 
      .Distinct(DataRowComparer.Default).Select(dr => dr.ItemArray[0]); 

     foreach (var item in query) 
     { 
      Console.WriteLine(item); 
     } 
1

你不能传递字符串作为排序依据的参数()。您需要在身份功能,通过像这样:

functiongettable().AsEnumerable().OrderBy(x=>x.Field<string>("Name")).Distinct() 

而且我不认为你会在这里得到不同的结果,因为方法Distinct()将使用TSource的默认等号运算符,在这种案件将是DataRow。它不会根据您的Name列的string值进行区分选择。