powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dapper
14 сообщений из 14, страница 1 из 1
Dapper
    #38865268
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Пытаюсь подружиться с ORM Dapper, хочу сделать универсальный метод, который будет возвращать объекты нужного типа. У меня есть такие классы
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class Group
{
    public int GroupId { get; set; }
    public int Parent { get; set; }
    public string GroupName { get; set; }
}
public class MSSQLcontroller
{
    private string connString;
    public MSSQLcontroller(string cs)
    {
        connString = cs;
    }
    public IEnumerable<object> Dapper_Select(string sql)
    {
        IEnumerable<object> retobj;
        using (SqlConnection cn = new SqlConnection(connString))
        {
            cn.Open();
            var o = cn.Query(sql);
            retobj = o;
            cn.Close();
        }        
        return retobj;
    }
}


Пытаюсь потом воспользоваться методом
Код: c#
1.
2.
3.
4.
5.
6.
var gr = mssql.Dapper_Select("Select GroupId, Parent, GroupName From Groups");
foreach (var g in gr)
{

     MessageBox.Show(((Group)g).GroupName);
}


И тут получаю ошибку: Не удалось привести тип объекта "DapperRow" к типу "Group"
Вот вопрос как бы сделать такой универсальный метод, который будет возвращать мне коллекцию нужного мне типа.
Хотела бы видеть что-то типа такого, код не рабочий, но мысль я думаю, понятна. Спасибо.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public object Dapper_Select(string sql, object typeobj)
{
    object o=null;
    using (SqlConnection cn = new SqlConnection(connString))
    {
        cn.Open();
        o = cn.Query<typeobj>(sql);
        cn.Close();
    }
    return o;
}
вызов
List<Group> gr;
gr = (List<Group>)mssql.Dapper_Select("Select GroupId, Parent, GroupName From Groups", Group);
...
Рейтинг: 0 / 0
Dapper
    #38865326
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka,

читайте внимательнее документацию , и не изобретайте велосипедов. В Dapper уже есть generic-метод, который делает маппинг на ваш класс:
Код: c#
1.
2.
3.
4.
5.
using (SqlConnection cn = new SqlConnection(connString))
{
  cn.Open();
  return cn.Query<Group>("Select GroupId, Parent, GroupName From Groups");
}
...
Рейтинг: 0 / 0
Dapper
    #38865367
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны, это я понимаю. Просто получается, что для каждого моего класса Group, User и других в классе MSSQLcontroller нужно реализовывать методы для каждого класса, а я хотела чтобы метод был один, просто указывать свой класс на который бы даппер делал маппинг. Просто не знаю, может такое и нельзя сделать.
...
Рейтинг: 0 / 0
Dapper
    #38865388
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka,
Ясно же написали.
return cn.Query <Group> ("Select GroupId, Parent, GroupName From Groups");
...
Рейтинг: 0 / 0
Dapper
    #38865425
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я немного изменю свой вопрос.
В строке
return cn.Query<Group>("Select ....");
Вместо явного указания класса Group могу ли я использовать переменную? Может нужно использовать какую-нибудь функцию, которая по названию вернет класс т.е.
string g="Group";
return cn.Query<g>("Select ....");
было одно и тоже что и
return cn.Query<Group>("Select ....");
...
Рейтинг: 0 / 0
Dapper
    #38865435
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaЯ немного изменю свой вопрос.
В строке
return cn.Query<Group>("Select ....");
Вместо явного указания класса Group могу ли я использовать переменную? Может нужно использовать какую-нибудь функцию, которая по названию вернет класс т.е.
string g="Group";
return cn.Query<g>("Select ....");
было одно и тоже что и
return cn.Query<Group>("Select ....");

Generic Methods (C# Programming Guide)

Не могу понять... чего вы уперлись...
...
Рейтинг: 0 / 0
Dapper
    #38865476
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4kaВместо явного указания класса Group могу ли я использовать переменную? Может нужно использовать какую-нибудь функцию, которая по названию вернет класс т.е.

Не можете. Про то, что пишется там, нужно либо явно указать тип, либо дать информацию, что бы он сам смог вывести тип.
...
Рейтинг: 0 / 0
Dapper
    #38865490
Tamozhnya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно вызывать методы через рефлексию, передавая тип, как параметр.
...
Рейтинг: 0 / 0
Dapper
    #38865511
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TamozhnyaМожно вызывать методы через рефлексию, передавая тип, как параметр.
Говорят, еще есть люди, которые удаляют гланды per rectum.
...
Рейтинг: 0 / 0
Dapper
    #38865525
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, все получилось.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public object Dapper_Select<T>(string sql) where T : class
{
    object retobj = null;
    using (SqlConnection cn = new SqlConnection(connString))
    {
        cn.Open();
        retobj = cn.Query<T>(sql);
        cn.Close();
    }
    return retobj;
}

использование 
List<Group> gr = (List<Group>)mssql.Dapper_Select<Group>("Select GroupId, Parent, GroupName From Groups");
List<User> us = (List<User>)mssql.Dapper_Select<User>("Select UserId, Login, FirstName, Middlename, Surname From Users");
...
Рейтинг: 0 / 0
Dapper
    #38865561
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
object на IList<T> ?
...
Рейтинг: 0 / 0
Dapper
    #38865582
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kolu4ka
Код: c#
1.
public object Dapper_Select<T>


public IEnumerable<T> Dapper_Select<T>
...
Рейтинг: 0 / 0
Dapper
    #38865587
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser, вот не знаю правильно ли я Вас поняла
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public List<T> Dapper_Select<T>(string sql) where T : class
{
    List<T> retobj = null;
    using (SqlConnection cn = new SqlConnection(connString))
    {
        cn.Open();
        retobj = (List<T>)cn.Query<T>(sql);
        cn.Close();
    }
    return retobj;
}


тогда можно использовать без преобразования в List
List<Group> gr = mssql.Dapper_Select<Group>("Select ......");
...
Рейтинг: 0 / 0
Dapper
    #38865613
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buserobject на IList<T> ?
там тайпкастинг проходит нормально, потому что в итоге вызывается вот это:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public static IEnumerable<T> Query<T>(
  #if CSHARP30
    this IDbConnection cnn,
    string sql,
    object param,
    IDbTransaction transaction,
    bool buffered,
    int? commandTimeout,
    CommandType? commandType
  #else
    this IDbConnection cnn,
    string sql, dynamic param = null,
    IDbTransaction transaction = null,
    bool buffered = true,
    int? commandTimeout = null,
    CommandType? commandType = null
  #endif
)
{
  var data = QueryInternal<T>(cnn, sql, param as object, transaction, commandTimeout, commandType);
  return buffered ? data.ToList() : data;
}


а у ТС buffered==true. Повезло ТС.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dapper
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]