linq2db 可以创建具有特定列的 ORDER BY 但不包括 SELECT 中的该列的查询吗?

Can linq2db create query that has ORDER BY by specific column but without including that column in SELECT?

我使用 linq2db 作为我的项目 (ASP.NET Core 2.2) 和 Oracle 数据库的 ORM。我想从数据库中获取按特定列排序的产品列表,但该列不需要显示在前端客户端上。

SQL 我正在寻找的查询应该是这样的:

SELECT Id, Name 
FROM Products
ORDER BY InternalOrder

所以当我像这样在我的 C# 代码中使用 linq2db 时:

using (var db = new ProductsDao())
{
    return db.Products.Select(p => new Product
        {
             Id = p.Id,
             MarketName = p.MarketName
        })
        .OrderBy(p => p.InternalOrder)
        .ToArray();
}

然后 linq2db 将其转换为以下 SQL 查询:

SELECT
    t1.Id,
    t1.Name
FROM
    Products t1
ORDER BY
    NULL

注意 "ORDER BY NULL" 实际上不会进行任何排序。

但是,如果我像这样在 Select() 中添加 InternalOrder:

using (var db = new ProductsDao())
{
    return db.Products.Select(p => new Product
        {
             Id = p.Id,
             MarketName = p.MarketName,
             InternalOrder = p.InternalOrder  // this is added
        })
        .OrderBy(p => p.InternalOrder)
        .ToArray();
}

然后我在生成的 SQL 查询中得到正确的 ORDER BY 子句:

SELECT
    t1.Id,
    t1.Name,
    t1.InternalOrder
FROM
    Products t1
ORDER BY
    t1.InternalOrder

但是,在这种情况下,我必须在 SELECT 语句中包含 InternalOrder 列,这是我想避免的事情,因为我在结果中不需要该字段。

请注意,在实际应用程序中,我可能有非常大的表和多个列,我想按这些列进行排序但不想包含在结果中。不从数据库获取这些列的值应该可以节省一些性能成本。

为了代码的完整性,这里是我在上面的示例中使用的与 linq2db 相关的 类:

[Table(Name = "Products")]
public class Product
{
    [Column(Name = "Id")] 
    public decimal Id { get; set; }

    [Column(Name = "Name")] 
    public string Name { get; set; }

    [Column(Name = "InternalOrder", CanBeNull = false)] 
    public int InternalOrder { get; set; }
}       

public class LiveEventServiceDao : LinqToDB.Data.DataConnection
{
    public LiveEventServiceDao() : base("MyOracleDb")
    {
    } 
    public ITable<Product> Products => GetTable<Product>();
}

有没有办法用 linq2db 完成这个?

尝试以下操作:

return db.Products.Select(p => new {Order = p.InternalOrder, Prod = p})
         .OrderBy(p => p.Order)        
         .Select(p => new Product {
        {
             Id = p.Prod.Id,
             MarketName = p.Prod.MarketName
        })

        .ToArray();