樹lambda表達式我有一個方法,通過一個ObjectDataSource饋送GridView和允許使用lambda表達式由列排序:建設泛型列表
public IList<UsersEntity> GetUsers()
{
return new List<UsersEntity>(new[] {
new UsersEntity{ UsrId =1, UsrName="Luis" },
new UsersEntity{ UsrId = 2, UsrName = "Pablo"} });
}
public IList<UsersEntity> GetUsers(string OrderBy)
{
string[] ordParts = OrderBy.Split(' ');
string ordBy = ordParts[0];
string direction = "ASC";
if (2 == ordParts.Length)
direction = "DESC";
//Get Unsorted List
List<UsersEntity> Lista = (List<UsersEntity>)GetUsers();
//Function to order
Func<UsersEntity, object> myFunct = null;
myFunct = (usr) => {
if ("UsrId" == ordBy) return usr.UsrId;
else return usr.UsrName;
};
//sort list
if ("ASC" == direction)
return Lista.OrderBy(myFunct).ToList();
else
return Lista.OrderByDescending(myFunct).ToList();
}
但我想要的東西更實用的東西,對於所有類型的作品列表並且不涉及添加大量代碼。所以我寫了這個功能,我無法完成:
public class OrdenarEntidades<T>
{
public static IEnumerable<T> SortList(IEnumerable<T> Listado, string OrderByArg)
{
string[] arrOrderBy = OrderByArg.Split(' ');
string orderBy = arrOrderBy[0];
string direction = "ASC";
if (2 == arrOrderBy.Length)
direction = "DESC";
foreach (PropertyInfo pInfo in typeof(T).GetProperties())
{
if (orderBy == pInfo.Name)
{
Type tipDev = pInfo.PropertyType;
Func<T, tipDev> MyFunct = (Entity) => { pInfo.GetValue(Entity, null); };
if ("ASC" == direction)
Listado.OrderBy(MyFunct);
else
Listado.OrderBy(MyFunct);
}
}
return Listado;
}
}
我知道這個代碼不編譯,但表達了我想要完成的想法。
Marc Gravell給出了一個近似什麼我正在尋找(here),但不知道怎樣使它適應我的代碼
在此之前,非常感謝你。
http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet –
多想想你的問題......是什麼上下文你要使用的功能?似乎只是包裝linq功能很麻煩。 OrderBy字符串是否存儲在數據庫中? –