Как использовать Dapper с производными типамиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать Dapper с производными типами

Сообщение Anonymous »

У меня есть около 20 классов, производных от ModelBase (которые содержат общие вещи, такие как CreationDate, Id и т. д.).
Использование Dapper , эти производные классы легко сохранять и удалять (вся работа выполняется предпоследней строкой)

Код: Выделить всё

public static bool ModelDelete(ModelBase model, SqlConnection? conn = null, SqlTransaction? trans = null)
{
bool connectionIsNew = (conn is null);
bool transactionIsNew = (trans is null);

try
{
if (connectionIsNew)
conn = new SqlConnection(Globals.connString);

if (conn is null)
{
throw new Exception("Unable to establish a database connection in Data.ModelDelete");
return false;
}
else
{
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();
}

if (transactionIsNew)
trans = conn.BeginTransaction();

DynamicParameters p = new DynamicParameters();
p.Add("Id", model.Id, DbType.Int32);
p.Add("Error", null, DbType.String, ParameterDirection.Output, 8000);
string spName = $"sp{model.GetType().Name}_Delete";
int recordsAffected = conn.Execute(spName, p, trans);
}
catch (Exception exc)
{ }
}
Но, похоже, я не могу сделать то же самое с помощью Get/ и в итоге получим

Код: Выделить всё

public static ModelBase ModelGet(Type t, int id, SqlConnection? conn = null, SqlTransaction? trans = null, bool withDependents = false)
{
bool connectionIsNew = (conn is null);
bool transactionIsNew = (trans is null);
ModelBase model = default!;

try
{
if (connectionIsNew)
conn = new SqlConnection(Globals.connString);

if (conn is null)
{
throw new Exception("Unable to establish a database connection in Data.ModelGet");
}
else
{
if (conn.State != System.Data.ConnectionState.Open)
conn.Open();

if (transactionIsNew)
trans = conn.BeginTransaction();

var p = new { Id = id };

string spName = $"sp{t.Name}_Get";

switch (t.Name)
{
case nameof(Account):
model = conn.QuerySingle(spName, p, trans);
break;

case nameof(AccountGroup):
model = conn.QuerySingle(spName, p, trans);
break;

case nameof(Address):
model = conn.QuerySingle(spName, p, trans);
break;

case nameof(Agency):
model = conn.QuerySingle(spName, p, trans);
break;
и так далее со всеми производными классами моделей. Это работает, но неэлегантно. Есть ли лучший способ, чем иметь отдельный conn.QuerySingle для каждого из моих производных классов?

Подробнее здесь: https://stackoverflow.com/questions/791 ... ived-types
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как использовать Dapper с производными типами
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как использовать Dapper с производными типами
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как использовать Dapper с производными типами
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как использовать ctypes Python для взаимодействия с параметризованными производными типами Fortran?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Проблемы сходимости минимизации SciPy для целевой функции с малыми значениями и числовыми производными
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»