使用查询表达式的 Linq 顺序

Posted

技术标签:

【中文标题】使用查询表达式的 Linq 顺序【英文标题】:Linq order by using query expression 【发布时间】:2019-03-13 04:43:31 【问题描述】:

是否可以使用基于动态字符串参数的 linq 查询表达式来做 orderby 表达式?因为我的查询产生了奇怪的 SQL 查询

我的 linq:

var product = from prod in _context.Products
              join cat in _context.Categories on prod.CategoryId equals cat.CategoryId
              join sup in _context.Suppliers on prod.SupplierId equals sup.SupplierId
              orderby sortParam
              select new ProductViewModel
              
                   ProductName = prod.ProductName,
                   ProductId = prod.ProductId,
                   QuantityPerUnit = prod.QuantityPerUnit,
                   ReorderLevel = prod.ReorderLevel,
                   UnitsOnOrder = prod.UnitsOnOrder,
                   UnitPrice = prod.UnitPrice,
                   UnitsInStock = prod.UnitsInStock,
                   Discontinued = prod.Discontinued,
                   Category = cat.CategoryName,
                   Supplier = sup.CompanyName,
                   CategoryId = cat.CategoryId,
                   SupplierId = sup.SupplierId
              ;

在哪里var sortParam = "prod.ProductName"

上面的代码产生了奇怪的 sql,其中 sortParam 的 order 被转换为 (SELECT 1)。下面的 sql profiler 捕获的完整查询:

exec sp_executesql N'SELECT [prod].[ProductName], [prod].[ProductID], [prod].[QuantityPerUnit], [prod].[ReorderLevel], [prod].[UnitsOnOrder], [prod].[UnitPrice], [prod].[UnitsInStock], [prod].[Discontinued], [cat].[CategoryName] AS [Category], [sup].[CompanyName] AS [Supplier], [cat].[CategoryID], [sup].[SupplierID]
FROM [Products] AS [prod]
INNER JOIN [Categories] AS [cat] ON [prod].[CategoryID] = [cat].[CategoryID]
INNER JOIN [Suppliers] AS [sup] ON [prod].[SupplierID] = [sup].[SupplierID]
ORDER BY (SELECT 1)
OFFSET @__p_1 ROWS FETCH NEXT @__p_2 ROWS ONLY',N'@__p_1 int,@__p_2 int',@__p_1=0,@__p_2=10

我看到很多人使用动态参数做linq order,但他们都使用lambda而不是查询表达式,请赐教

【问题讨论】:

sortParam是一个字符串变量,在查询时是一个常数值,按常数值排序和不排序是一样的。 【参考方案1】:

如前所述,您传递的是字符串值,而不是反映列名的表达式。但是,有一些选项可以满足您的需求,例如here。

【讨论】:

以上是关于使用查询表达式的 Linq 顺序的主要内容,如果未能解决你的问题,请参考以下文章

Linq

LINQ查询表达式基础

在LINQ查询中使用GROUPBY时,无法转换LINQ表达式的GroupByShaperExpression:

按子句顺序排列的 LINQ 动态表达式

Linq学习之旅——LINQ查询表达式

LINQ 查询表达式(C# 编程指南)