ORM, такой как Entity Framework , безусловно, является лучшим вариантом здесь, но вы можете абсолютно создать класс, который мог бы запрашивать базу данных таким образом.У вас не будет параметризованных запросов или транзакций, и вы действительно не будете экономить так много для повторного использования, так как каждый раз, когда вы вызываете его, вам нужно будет предоставить много кода, чтобы он начал функционировать.
Пример.Возьмите класс запроса:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace QueryExample {
public class Query {
private readonly SqlConnection _connection;
public Query(SqlConnection connection) {
_connection = connection;
}
public IEnumerable<T> Run<T>(string text, Func<SqlDataReader, T> builder) {
var results = new List<T>();
try {
_connection.Open();
using (var command = new SqlCommand()) {
command.Connection = _connection;
command.CommandType = CommandType.Text;
command.CommandText = text;
var reader = command.ExecuteReader();
if (reader.HasRows)
while (reader.Read())
results.Add(builder(reader));
}
_connection.Close();
} catch (Exception e) {
Console.WriteLine(e.Message);
}
return results;
}
}
}
... теперь возьмем пример запуска этого класса:
using System;
using System.Data.SqlClient;
namespace QueryExample {
public class Example {
public static void Run() {
using (var connection = new SqlConnection(string.Empty)) {
var query = new Query(connection);
const string text = "SELECT TOP 1 fi.financialimpactid, " +
"fi.effectivedate " +
" FROM FinancialImpact fi " +
" INNER JOIN [Case] c ON c.caseid = " +
"fi.caseid " +
" WHERE fi.isDeleted = 0 AND " +
"c.IsDeleted = 0";
var results = query.Run(text, GetData);
// do something with the results
}
}
private static Data GetData(SqlDataReader reader) => new Data {
FinancialImpactId = reader.GetInt32(0),
EffectiveDate = reader.GetDateTime(1)
};
}
internal class Data {
public int FinancialImpactId { get; set; }
public DateTime EffectiveDate { get; set; }
}
}
Вы видите, что запуск класса не дает вам такой юзабилити,тем более что вам всегда придется возвращать результат (что затрудняет определение «конструкторов результатов» INSERT INTO
, UPDATE
и DELETE
), и он всегда должен быть списком (не такой большой проблемой, новсегда нужно делать пустую проверку, и доступ к первой записи может быстро устареть)?
Это одна из причин, почему вы используете ORM в настоящее время.Они не только упрощают создание запросов, но и делают ненужной параметризацию.