0

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

我正在寻找的 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 做到这一点?

4

1 回答 1

1

尝试以下:

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();
于 2019-01-18T18:45:40.723 回答