我使用 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 做到这一点?