Linq To SQL:按任意属性(列)名称排序查询

我有一个更大/更复杂的问题,但为了简单起见,让我们考虑以下内容:

我们假设我在SQL DataBase中有一个名为Product的表 ,它有两列, ID (int,主键)Name (varchar / string) 。 我还有一个简单的LINQ DataContext

我有一个查询构造并交给“我的”function。 让我们说它是这样的:( 虽然它可能有点复杂)

IQueryable query = from p in db.Products select p; 

一旦我的方法获得此查询,作为参数传入,它必须更改排序顺序,例如

 IQueryable sortedQuery = query.OrderBy(x => x.Name); 

我想使这更通用,即指定要排序的字段。 通常,我可以执行一个带字符串的switch语句。 但是我想知道是否有办法直接传递参数。 我打算将它扩展到其他数据库表,因此这些switch语句会变得乏味。

我在尝试这样的事情:

 IQueryable sortedQuery = query.OrderBy(x => (typeof(Product)).GetProperty(“Name”)); 

但这不起作用。 我还想确保维护LINQ to SQL,即在SQL Server上进行排序。 因此,如果我调试,我应该从这个LINQ查询获得一个SQL查询。

预先感谢您的帮助。

您可以将Dynamic Linq用于此目的。

请参见此处动态LINQ(第1部分:使用LINQ动态查询库)

然后你可以这样打电话:

 var query = DBContext.Users.Where( "Age > 3" ).OrderBy( "Name asc" ); 

试试这个:

 query.OrderBy(x => x.GetType().GetProperty(“Name”).GetValue(x, null)); 

你不能只抓住房产。 您需要获取该属性的值,因此调用GetValue

它并不像看起来那么容易。 LINQ to SQL引擎解析传递给OrderBy方法的表达式,以获取您引用的属性的名称,然后使用此信息组成一个纯SQL order by子句。

我想也许可以通过使用reflection来完成。 也许你可以从这个SO问题的接受答案中得到一些有用的东西。