C#. NET Как лучше организовать SQL запросы и получить чистый код - PullRequest
1 голос
/ 16 апреля 2020

я и мой коллега сталкиваемся с проблемой. У нас есть пара SQL запросов в виде строк. Вот пример:

    public class Query
{

    public static string CreditTransferId(string expectedValue, string table, int statusId, int messageTypeId, int destination103, int destination202, string StoreStatus202Id)
    {
        return $"SELECT top 1 Id from {table} where MessageId = '{expectedValue}' and FlowId=3 and StatusId={statusId} and MessageTypeId={messageTypeId} and " +
          $" Destination103={destination103} and Destination202={destination202} and StoreStatus103Id is null and StoreStatus202Id {StoreStatus202Id}";
    }
}

Пока мы возвращаем их как строки из методов внутри класса Query. Мы хотим реорганизовать код, чтобы он стал чистым, поскольку у нас есть метод с более чем 3 параметрами, который довольно сложно использовать в любом случае.

Как бы вы go об этом? Какой самый чистый способ организации SQL запросов, для которых нужно много параметров, как у нас в коде выше? Буду очень признателен за любые ответы, которые могут улучшить текущее состояние нашего кода.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

EF великолепен, и вы должны решить, хотите ли вы этого. Есть несколько случаев, когда это не подходит. Если вы решили придерживаться простых текстовых запросов, как насчет разделения запросов на части: FromBuilder JoinBuilder GroupBuilder Построитель условий et c

ex.:

return @"
"+new TableIdSelectorBuilder(table).Get() +@"
"+new FromBuilder().Get(table) +@"
"+new TableConditionByIdBuilder(table).Get(I'd)+@"
";

РЕДАКТИРОВАТЬ: хранимые процедуры позволяют изменять Запросы без публикации новой версии приложения, но немного задницу в работе над живым организмом. По крайней мере, иногда.

0 голосов
/ 16 апреля 2020

Dynami c SQL - очень плохая вещь для начала, так как они открыты для инъекции SQL, вы должны использовать параметризованные запросы и вернуть строку.

"eg: SELECT top 1 Id from [Table] where [MessageId] = @messageId" et c

Так что вам не нужно передавать какие-либо значения, вы бы добавили их в свой список SqlParamater's

Имя таблицы, вероятно, бессмысленно, так как оно связано с sql, поэтому, вероятно, просто добавьте это в sql строку

Для этого на самом деле не нужен дополнительный класс, просто создайте переменную sql там, где вы ее вызываете, так что она тут же, если вам это нужно?

.. или используйте хранимые процедуры

.. или используйте Entity Framework

...