Может ли linq2db создать запрос с ORDER BY по конкретному столбцу, но без включения этого столбца в SELECT? - PullRequest
0 голосов
/ 18 января 2019

Я использую 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?

1 Ответ

0 голосов
/ 18 января 2019

Попробуйте следующее:

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();
...