我看到一个帖子,让一个使用一个通用的表达订购数据以下功能:
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
一个快速的观察:你不是真的需要使用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
我在这个目标是消除大量的重复代码。 除了处理上升/下降我的“排序依据”功能处理其他一些常见的逻辑具有良好的。 假设在原发布函数定义,可以简单地这样做:
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);
:
表达只能有一个类型; 我的首选答案在这里会是这样的:
IQueryable<T> query = ...
if({case 1}) {
query = query.OrderBy(x=>x.SomeValue);
} else if({case 2}) {
query = query.OrderBy(x=>x.SomeOtherValue);
} ...
但是,如果你想要做一些更灵活,你可能需要进入定制Expression
写作; 东西更多类似 。
我想你可能会寻找是有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