LINQ to SQL的:通过任意属性(列)名称排序查询(Linq To SQL: Sort Que

2019-07-21 12:51发布

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

让我们说,我有表中的SQL数据库称为产品 ,有两列,ID(INT,主键)名称 (VARCHAR /串)。 我也有一个简单的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查询。

预先感谢您的帮助。

Answer 1:

你可以使用Dynamic Linq用于此目的。

看到这里动态LINQ(1部分:使用LINQ动态查询库)

然后你就可以这样调用:

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


Answer 2:

尝试了这一点,而不是:

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

你不能只是抢财产。 你需要抓住关闭该属性的值,因此调用GetValue



Answer 3:

它不是像看起来那么容易。 的LINQ到SQL引擎解析传递给所述的表达OrderBy方法以获得你引用的属性的名称,然后使用此信息来构成一普通的SQL order by子句。

我想,也许它可以通过反射,反正来完成。 也许你可以得到的东西从接受的答案有用这太问题 。



文章来源: Linq To SQL: Sort Query by Arbitrary Property(Column) Name