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
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:
Func<T,IComparable> func = null;
if (IsString)
func = (T a) => a.SomeStringValue;
else if (IsInt)
func = (T a) => a.SomeIntValue;
// call orderBy with exp
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:
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);
:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With