Сортировать по невыбранному столбцу - PullRequest
2 голосов
/ 01 ноября 2019

Я пытаюсь использовать оператор SQL CONTAINSTABLE, чтобы получить список результатов поиска, например:

SELECT c.*, ccontains.[RANK]
FROM Customers c
INNER JOIN CONTAINSTABLE(Customers, LastName, @searchTerm) ccontains ON c.Id = ccontains.[KEY]

И вызываю эту функцию из EF Core 2.1:

var query = DbContext.Customers.FromSql("SELECT * FROM udfSearchCustomers(@searchTerm)",
    new SqlParameter(@searchTerm, mySearchTerm));
query = query.Include(c => c.Addresses).Take(maxResults);

Я хочу упорядочить результаты поиска по убыванию на RANK, чтобы получить наиболее релевантные результаты в верхней части. Добавление ORDER BY ccontains.[RANK] к моей функции недопустимо, так как мой SELECT * FROM udfSearchCustomers(...) будет заключен в EF Core: ORDER BY недопустимо для внутреннего запроса. Добавление query.OrderBy(c => c.Rank) невозможно, поскольку RANK не относится к сущности Customer.

Я пытался использовать System.Linq.Dynamic, а также другие решения для отражения, чтобы сделать это:

query = query.OrderBy("Rank");

Но я получил исключение:

«Ранг» не является членом типа «Клиент»

, что верно. Есть ли способ заказать столбец, а не сущность, или мне нужно будет создать объект запроса MyCustomerSearchQuery и использовать AutoMapper, чтобы преобразовать их в Customer? Я бы предпочел не делать этого, поскольку Customer имеет много свойств, и их синхронизация будет проблематичной.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Вы можете создать хранимую процедуру запроса, которая принимает два параметра: @searchKey, @orderByColumn.

      CREATE PROCEDURE [dbo].[UdfSearchCustomers]
                 @searchTerm varchar(50),
                 @orderByColumn varchar(50)

          AS
          BEGIN
          DECLARE @sql NVARCHAR(MAX);
          SET @sql =' SELECT c.*, ccontains.[RANK]
                  FROM Customers c
                  INNER JOIN CONTAINSTABLE(Customers, LastName, ''@searchTerm'') ccontains 
                  ON c.Id = ccontains.[KEY]
                  ORDER BY @orderByColumn'

            SET @sql = REPLACE(@sql, '@orderByColumn', @orderByColumn)
            SET @sql = REPLACE(@sql, '@searchTerm', @searchTerm)
            exec sp_executesql @sql
            END

    GO

Затем вы можете запросить ту же хранимую процедуру, что и:

var query = DbContext.Customers.FromSql("exec UdfSearchCustomers @p0, @p1", mySearchTerm, "Rank");

Если вы хотите добавить соединение в таблицу адресов, вы можете добавить соединение к хранимой процедуре. Это может дать вам желаемый результат.

0 голосов
/ 01 ноября 2019

вы можете попробовать с

 query = query.OrderBy(x => x.Rank);

ИЛИ

 query = query.OrderBy(x => x["Rank"]);
...