2009-09-10 84 views
5

我看到了下面的函数在一个帖子,它允许使用通用表达一个命令数据:问题与通用的LINQ排序依据功能

public static IOrderedQueryable<T> OrderBy<T, TKey>(
    this IQueryable<T> source, Expression<Func<T, TKey>> func, bool isDescending) { 
    return isDescending ? source.OrderByDescending(func) : source.OrderBy(func); 
} 

当我尝试使用此功能,我得到一个错误说“的类型或命名空间名称“TKEY的”找不到(是否缺少using指令或程序集引用?)”我在这里做了愚蠢的事情,但我无法弄清楚

编辑:。

在做了更多的研究之后,我认为我的问题在于构建Expr我通过它的激情。是否可以构建一个可以包含不同类型的表达式?假设我的数据集有一个字符串,一个int和一个bool,我想使用上面的通用函数来排序任何项目。我该怎么做呢?

我现在有这方面的工作:

if (IsString) 
{ 
    Expression<Func<T, string>> expString = ...; 
    // call orderBy with expString 
} 
else if (IsInt) 
{ 
    Expression<Func<T, int>> expInt; 
    // call orderBy w/ expInt 
} 
: 

我想是这样的:

Expression<Func<T, {something generic!}>> exp; 
if (IsString) 
    exp = ...; 
else if (IsInt) 
    exp = ...; 
: 
// call orderBy with exp 
+0

这似乎很好。你如何使用这种方法?你把它添加到静态类吗? – BFree 2009-09-10 19:46:59

回答

2

我的目标是消除很多重复的代码。除了处理升序/降序,我的“OrderBy”函数处理一些其他常见的逻辑也很好。假设在原发布函数定义,可以简单地这样做:

if ({need to sort by integer}) 
    query = OrderBy(objectT, a => a.myIntegerField, asc); 
else if ({need to sort by string}) 
    query = OrderBy(objectT, a=> a.myStringField, asc); 
: 
1

表达只能有一种类型的;我的首选答案在这里会是这样的:

IQueryable<T> query = ... 
if({case 1}) { 
    query = query.OrderBy(x=>x.SomeValue); 
} else if({case 2}) { 
    query = query.OrderBy(x=>x.SomeOtherValue); 
} ... 

但是,如果你想要做一些更灵活的,你可能会需要进入定制Expression写作;有东西more like this

+0

这就是我原来的样子,但由于我有很多字段,需要处理升序/降序排序,所以我最终得到了大量“重复”代码。我发布的答案似乎运作良好。 – ejwipp 2009-09-10 21:07:36

4

一个快速的观察:你不是真的需要使用lambda表达式(Expression<Func<T,TKey>>)。一个简单的代表(Func<T,TKey>)很好。

这么说,我想你可能会寻找的答案是这样的:

Func<T,IComparable> func = null; 
if (IsString) 
    func = (T a) => a.SomeStringValue; 
else if (IsInt) 
    func = (T a) => a.SomeIntValue; 
// call orderBy with exp 
+0

这看起来就像我在找什么。但是,我玩了一会儿,无法编译。当我尝试将func传递给OrderBy函数时,编译器会抱怨。如果你的方法可行,你的方法会稍微干净一些,但不幸的是,我现在不能花更多的时间。 – ejwipp 2009-09-14 16:51:45

+1

当你有时间时,请告诉我你看到的编译器错误是什么。 – jpbochi 2009-09-15 04:00:34

+0

我终于回到了这一点。我认为问题在于,在我的自定义orderBy函数中,我调用了不带Func参数的ThenBy - 它需要lambda表达式。 – ejwipp 2009-09-22 20:42:04

0

看看this answer

我的排序一般处理程序是:

  • “dgvProcessList” 是我的dataGridView
  • “过程” 是我的对象绑定到它
  • “E” 是我DataGridViewCellMouseEventArgs

      PropertyInfo column = (new Process()).GetType().GetProperties().Where(x => x.Name == dgvProcessList.Columns[e.ColumnIndex].Name).First(); 
         if (isSortedASC == true) 
          dgvProcessList.DataSource = ((List<Process>)dgvProcessList.DataSource).OrderByDescending(x => column.GetValue(x, null)).ToList(); 
         else 
          dgvProcessList.DataSource = ((List<Process>)dgvProcessList.DataSource).OrderBy(x => column.GetValue(x, null)).ToList(); 
    
         isSortedASC = !isSortedASC; 
         dgvProcessList.ClearSelection(); 
    

干杯