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查询。
提前感谢您的帮助
您可以使用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
子句。
我想也许这可以通过使用反射来完成。也许你可以从这个问题的公认答案中得到一些有用的东西。