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

本文关键字:排序 查询 属性 SQL To 任意 Linq | 更新日期: 2023-09-27 18:03:38

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

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

我构造了一个查询并交给了"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对SQL的维护,即排序要在SQL服务器上完成。因此,如果我调试,我应该从这个LINQ查询得到一个SQL查询。

提前感谢您的帮助

Linq To 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子句。

我想也许这可以通过使用反射来完成。也许你可以从这个问题的公认答案中得到一些有用的东西。