Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dapper / 14 сообщений из 14, страница 1 из 1
28.01.2015, 11:38
    #38865268
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Всем привет!
Пытаюсь подружиться с 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
28.01.2015, 12:06
    #38865326
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
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
28.01.2015, 12:33
    #38865367
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Сон Веры Павловны, это я понимаю. Просто получается, что для каждого моего класса Group, User и других в классе MSSQLcontroller нужно реализовывать методы для каждого класса, а я хотела чтобы метод был один, просто указывать свой класс на который бы даппер делал маппинг. Просто не знаю, может такое и нельзя сделать.
...
Рейтинг: 0 / 0
28.01.2015, 12:43
    #38865388
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Kolu4ka,
Ясно же написали.
return cn.Query <Group> ("Select GroupId, Parent, GroupName From Groups");
...
Рейтинг: 0 / 0
28.01.2015, 13:06
    #38865425
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Я немного изменю свой вопрос.
В строке
return cn.Query<Group>("Select ....");
Вместо явного указания класса Group могу ли я использовать переменную? Может нужно использовать какую-нибудь функцию, которая по названию вернет класс т.е.
string g="Group";
return cn.Query<g>("Select ....");
было одно и тоже что и
return cn.Query<Group>("Select ....");
...
Рейтинг: 0 / 0
28.01.2015, 13:14
    #38865435
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
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
28.01.2015, 13:47
    #38865476
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Kolu4kaВместо явного указания класса Group могу ли я использовать переменную? Может нужно использовать какую-нибудь функцию, которая по названию вернет класс т.е.

Не можете. Про то, что пишется там, нужно либо явно указать тип, либо дать информацию, что бы он сам смог вывести тип.
...
Рейтинг: 0 / 0
28.01.2015, 14:04
    #38865490
Tamozhnya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Можно вызывать методы через рефлексию, передавая тип, как параметр.
...
Рейтинг: 0 / 0
28.01.2015, 14:21
    #38865511
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
TamozhnyaМожно вызывать методы через рефлексию, передавая тип, как параметр.
Говорят, еще есть люди, которые удаляют гланды per rectum.
...
Рейтинг: 0 / 0
28.01.2015, 14:31
    #38865525
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Всем спасибо, все получилось.
Код: 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
28.01.2015, 15:03
    #38865561
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
object на IList<T> ?
...
Рейтинг: 0 / 0
28.01.2015, 15:17
    #38865582
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
Kolu4ka
Код: c#
1.
public object Dapper_Select<T>


public IEnumerable<T> Dapper_Select<T>
...
Рейтинг: 0 / 0
28.01.2015, 15:19
    #38865587
Kolu4ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
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
28.01.2015, 15:41
    #38865613
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dapper
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Dapper / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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