我有一个更大/更复杂的问题,但为了简单起见,让我们考虑以下内容:
我们假设我在 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查询。
提前感谢您的帮助。
答案 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的接受答案中获得有用的东西。