14

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

假设我在SQL 数据库中有一个名为Product的表,有两列ID (int, primary key)Name (varchar/string)。我也有一个简单的LINQ DataContext

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

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 查询。

预先感谢您的帮助。

4

3 回答 3

19

您可以Dynamic Linq用于此目的。

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

然后你可以像这样拨打电话:

var query = DBContext.Users.Where( "Age > 3" ).OrderBy( "Name asc" );
于 2013-03-13T15:16:04.913 回答
11

试试这个:

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

你不能只抢财产。您需要从该属性中获取值,因此调用GetValue.

于 2013-03-13T14:35:53.177 回答
1

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

我想也许它可以通过使用反射来完成,无论如何。也许你可以从这个 SO question的接受答案中得到一些有用的东西。

于 2013-03-13T15:00:39.727 回答