我在一篇帖子中看到以下函数,它允许人们使用通用表达式来排序数据:
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”(您是否缺少使用指令或程序集引用?)”。我在这里做了一些愚蠢的事情,但我无法弄清楚。
编辑:
在做了更多研究之后,我认为我的问题是构建我传递给它的表达式。是是否可以构建一个可以包含不同类型的表达式?假设我的数据集有一个字符串、一个整数和一个布尔值,并且我想使用上面的通用函数来按任何项目进行排序,我该怎么做
?现在就可以工作了:
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
I saw the following function in a posting which allows one to order data using a generic expression:
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);
}
When I try to use this function I get an error saying "The type or namespace name "TKey' could not be found (are you missing a using directive or an assembly reference?)". I'm doing something dumb here but I can't figure it out.
Edit:
After doing a bit more research, I think my problem is in building the Expression that I pass into it. Is it possible to build an expression that can contain different types? Let's say my dataset has a string, an int, and a bool and I want to use the generic function above to sort by any of the items. How do I do this?
I have this working now:
if (IsString)
{
Expression<Func<T, string>> expString = ...;
// call orderBy with expString
}
else if (IsInt)
{
Expression<Func<T, int>> expInt;
// call orderBy w/ expInt
}
:
I want something like:
Expression<Func<T, {something generic!}>> exp;
if (IsString)
exp = ...;
else if (IsInt)
exp = ...;
:
// call orderBy with exp
发布评论
评论(5)
一个快速观察:您实际上并不需要使用 lambda 表达式 (
Expression>
)。一个简单的委托 (Func
) 就可以了。也就是说,我认为您可能正在寻找的答案是:
One quick observation: You don't really need to use a lambda expression (
Expression<Func<T,TKey>>
). A simple delegate (Func<T,TKey>
) is fine.That said, I think the answer you might be looking for is this:
我的目标是消除大量重复的代码。除了处理升序/降序之外,我的“OrderBy”函数还可以很好地处理其他一些常见逻辑。假设原始帖子中的函数定义,可以简单地执行以下操作:
My goal in this was to eliminate a lot of repetitious code. In addition to handling the ascending/descending my "OrderBy" function handles some other common logic has well. Assuming the function definition in the original posting, one can simply do this:
表达式只能有一种类型;我在这里的首选答案是这样的:
但是,如果您想做一些更灵活的事情,您可能需要进行自定义
Expression
编写; 更像这样。The expression can only have one type; my preferred answer here would be something like:
However, if you want to do something more flexible, you'd probably need to get into custom
Expression
writing; something more like this.我认为您可能正在寻找的是在 linq 中拥有动态 orderby 子句的能力。有关该主题的一些好文章,请参阅
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
I think what you may be looking for is the ability to have a dynamic orderby clause within linq. For some good articles on the topic see
http://blogs.msdn.com/swiss_dpe_team/archive/2008/06/05/composable-linq-to-sql-query-with-dynamic-orderby.aspx
or
http://www.equivalence.co.uk/archives/819
or
http://www.rocksthoughts.com/blog/archive/2008/01/24/linq-to-sql-dynamic-queries.aspx
看看 这个答案
我用于排序的通用处理程序是:
“e”是我的DataGridViewCellMouseEventArgs
干杯
Take a look at this answer
My generic handler for sorting is:
"e" is my DataGridViewCellMouseEventArgs
Cheers