Я использую linq2db в качестве ORM для своего проекта (ASP.NET Core 2.2) с базой данных Oracle.Я хочу получить список продуктов из базы данных, упорядоченных по определенному столбцу, но этот столбец не нужно отображать на клиентском компьютере.
SQL-запрос, который я ищу, должен выглядеть примерно так:
SELECT Id, Name
FROM Products
ORDER BY InternalOrder
Поэтому, когда я использую linq2db в своем коде на C #, вот так:
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", который фактически не будет выполнять никакого упорядочения.
Однако, если я добавлю InternalOrder в Select () следующим образом:
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();
}
, тогда я получу правильное предложение ORDER BYв сгенерированном SQL-запросе:
SELECT
t1.Id,
t1.Name,
t1.InternalOrder
FROM
Products t1
ORDER BY
t1.InternalOrder
Однако в этом случае мне пришлось включить столбец InternalOrder в инструкцию SELECT, чего я хочу избежать, поскольку мне не нужно это поле в результатах.
Обратите внимание, что в реальном приложении у меня могут быть очень большие таблицы с несколькими столбцами, которые я хочу отсортировать, но не хочу включать в результат.Не получение значений из базы данных для этих столбцов должно сэкономить некоторые затраты на производительность.
Для полноты кода здесь приведены мои классы, связанные с 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?