我想写一个图书查询的方法,大概如下
现在的问题是:我排序OrderBy写死的是用的book类Name属性,但是我不想写死,由
参数决定,比如说,
参数传入author就是OrderBy(t =>t.author);
参数传入keyword1就是OrderBy(t =>t.keyword1);
这个该如何实现啊。苦思不得解中,渴望得到帮助,多谢:)
-------------------------------------
public class book
{
  string name;
  string author;
  string keyword1;
  string keyword2;
  string keyword3;
  int ISBN;
  DataTime publishTime;
}
-------------------------------------
public class dbQuery
{
  public List<QueryResult> QueryBooks(string orderKey)
  {
  BooksDB context = new BooksDB("name=BooksDB");
  List<QueryResult> results = new List<QueryResult>();
  using (context)
  {
  results = (from result in context.QueryResults
  select result).OrderBy(t =>t.name).ToList();
  }
  return results;
  }
}

解决方案 »

  1.   

    你这也没复杂条件,可以直接写为:public List<QueryResult> QueryBooks(string orderKey)
      {
         using (var context = new BooksDB("name=BooksDB"))
         {
             switch(orderKey)
             {
                case "author":
                   return context.QueryResults.OrderBy(r => r.author).ToList();
                case "xxx":
                   return context.QueryResults.OrderBy(r => r.xxx).ToList();
                default:
                   return context.QueryResults.ToList();
             }
         }
      }另外还可以用反射OrderByreturn context.QueryResults.OrderBy(r => r.GetType().GetProperty("Author").GetValue(r, null));
      

  2.   


    class Program {
    static void Main(string[] args) {
    users = new List<User>{
    new User{Name="AAA", Age=5},
    new User{Name="BBB", Age=1},
    new User{Name="CCC", Age=3},
    };
    OrderBy<string>(t => t.Name);
    Console.WriteLine("----------------------");
    OrderBy<int>(t => t.Age);
    Console.WriteLine("press any key to exit.");
    Console.ReadLine();
    } private static void OrderBy<TKey>(Func<User, TKey> selector) {
    users.OrderBy(selector).Select(p=>p).ToList().ForEach(t=>Console.WriteLine(t.Name));
    } private static List<User> users;
    }
      

  3.   

    是我简化了,真实case会非常多,这样罗列不是个办法啊
      

  4.   

    直接用lambda不就ok了,用反射就搞大了,呵呵
      

  5.   

    看到了。异常了
    LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object, System.Object[])' method, and this method cannot be translated into a store expression.
      

  6.   

    厄,忘了,Linq2EF 不能直接用反射。要么 ToList() 之后再 OrderBy,要么去下个 Dynamic.cs http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
      

  7.   

    lamba怎么做啊?比如说入参传入了string是“author”
    就要相当于调用了OrderBy(t => t.author);?比如说入参传入了string是“name”
    就要相当于调用了OrderBy(t => t.name);?
      

  8.   


    这样还不如直接调,何必封装呢?哪里体现动态?
    加上 if else 判断,就和我用 switch 是一样的了。真动态要么用 Dynamic.cs (Emit来做),要么动态生成 Lambda Expression 
    msdn: http://msdn.microsoft.com/zh-cn/library/bb882637.aspx推荐下个 Dynamic.cs 就都解决了,你可以直接写 OrderBy("xxx desc") 这样的语法。