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

时间:2013-03-13 14:32:58

标签: c# linq c#-4.0 linq-to-sql

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

我们假设我在 SQL数据库中有一个名为产品的表,有两列, ID (int,primary键)名称 (varchar / string)。我还有一个简单的 LINQ DataContext

我构建了一个查询并交给“my”函数。让我们说它类似于:(虽然它可能有点复杂)

IQueryable<Product> query = from p in db.Products select p;

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

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

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

我正在尝试类似的事情:

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

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

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:16)

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

请参阅此处Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

然后你可以这样打电话:

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

答案 1 :(得分:9)

试试这个:

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

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

答案 2 :(得分:1)

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

我想也许可以通过使用反射来完成。也许你可以从this SO question的接受答案中获得有用的东西。