This is the newest edition of Linq madness. So I added an OrderBy to my lame dynamic query thing.
private static IQueryable<User> GetUserList(Expression<Func<User, Boolean>> whereClause, Expression<Func<User, String>> orderBy) { var query = (from user in GetDataContext().Users select user).Where(whereClause).OrderBy(orderBy); return query; }
Now you will notice there is a new Expression in town and it’s name isn’t Reggie Hammond. It is my order by Expression which uses a Func<User, String>. It took me a minute to figure out how this works. I thought it was somehow in need of the property name to order by, but in reality it is looking for a list of strings to order by. Simple. I could do something like: (Ignore the WhereLikeFirstNameLastNameUserName for now)
return GetUserList
(
WhereLikeFirstNameLastNameUserName(name),
currentUser => currentUser.UserName
).ToList();
But that’s boring. I want to be able to pass a method that would give the correct string to orderby somewhat cleaner. In comes a method that returns an Expression. OooOoOOo.
private static Expression<Func<User, String>> SortOnUserName() { return currentUser => currentUser.UserName; }
So now it looks like:
public static IList<User> GetUserListByLikeName(String name) { return GetUserList ( WhereLikeFirstNameLastNameUserName(name), SortOnUserName() ).ToList(); }
Cleaner… Now what is WhereLikeFirstNameLastNameUserName? Simple, that is my where Expression just being returned in this method:
private static Expression<Func<User, Boolean>> WhereLikeFirstNameLastNameUserName(String name) { return currentUser => SqlMethods.Like(currentUser.UserName, "%" + name + "%") || SqlMethods.Like(currentUser.FirstName, "%" + name + "%") || SqlMethods.Like(currentUser.LastName, "%" + name + "%"); }
By the way, SqlMethods.Like is just a built in method used only with Linq to Sql. Probably shouldn’t have used it in this example but oh well. Live with it.
OH NO NOT THE USINGS!!
using System; using System.Collections.Generic; using System.Data.Linq.SqlClient; using System.Linq; using System.Linq.Expressions;