问题通用的LINQ排序依据功能(Problem with Generic Linq OrderBy

2019-07-17 15:50发布

我看到一个帖子,让一个使用一个通用的表达订购数据以下功能:

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指令或程序集引用?)”我做了愚蠢的事情在这里,但我可以“T看着办吧。

编辑:

做多一点的研究后,我认为我的问题是在建设,我进入它的表达。 是否有可能建立一个可以包含不同类型的表达? 比方说,我的数据集有一个字符串,一个int和一个布尔值,我想用上面的通用功能的任何项目进行排序。 我该怎么做呢?

我现在有这方面的工作:

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

Answer 1:

一个快速的观察:你不是真的需要使用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


Answer 2:

我在这个目标是消除大量的重复代码。 除了处理上升/下降我的“排序依据”功能处理其他一些常见的逻辑具有良好的。 假设在原发布函数定义,可以简单地这样做:

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);
:


Answer 3:

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

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

但是,如果你想要做一些更灵活,你可能需要进入定制Expression写作; 东西更多类似 。



Answer 4:

我想你可能会寻找是有LINQ中的动态排序依据条款的能力。 有关话题看到一些好文章

http://blogs.msdn.com/swiss_dpe_team/archive/2008/06/05/composable-linq-to-sql-query-with-dynamic-orderby.aspx

要么

http://www.equivalence.co.uk/archives/819

要么

http://www.rocksthoughts.com/blog/archive/2008/01/24/linq-to-sql-dynamic-queries.aspx



Answer 5:

看看这个答案

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

  • “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(); 

干杯



文章来源: Problem with Generic Linq OrderBy function
标签: c# linq lambda