2016-11-26 2 views
3

Я использовал dapper в последнее время и хотел сделать динамический метод, который облегчил бы выбор вещей с помощью sql. Это мой код:Кастинг IEnumerable <dynamic> с пользовательским классом

Класс:

public class Method 
{ 
    public static IEnumerable<dynamic> QueryAll(string table) 
    { 
     dynamic dyn = table; 
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString()); 
     using (con) 
     { 
      string sql = String.Format("SELECT * FROM {0}", table); 
      IEnumerable<dynamic> ie = con.Query<dynamic>(sql, null); 
      return ie; 
     } 

    } 
} 

Вызов функции здесь:

IEnumerable<posts> = Method.QueryAll("posts"); 

Это дает мне ошибку that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts.

Как это сделать, чтобы заставить его работать.

ответ

5

Технически вы можете просто использовать метод IEnumerable.Cast, чтобы использовать все экземпляры, возвращаемые методом, в фактический экземпляр.

IEnumerable<posts> = Method.QueryAll("posts").Cast<posts>(); 

Однако если вы Allready знаете на фактический тип почему бы не использовать его в запросе Allready? dynamic следует обрабатывать с осторожностью и только в том случае, если это действительно так, и я сомневаюсь, что это так. Например, вы можете добавить фактический тип, тип-параметр для метода:

public static IEnumerable<T> QueryAll<T>(string table) 
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString()); 
    using (con) 
    { 
     string sql = String.Format("SELECT * FROM {0}", table); 
     IEnumerable<T> ie = con.Query<T>(sql, null); 
     return ie; 
    } 
} 

Теперь вы можете назвать это следующим образом:

var result = Method.QueryAll<posts>("posts"); 

Как и в сторону Method это имя класса на самом деле плохо, как posts тоже. Вы должны указать имена классов, которые описывают, для чего они служат, и что они делают. Кроме того, существуют соглашения об именах, предлагающие использовать PascalCase -имен для класса, создающего ваш класс Posts. Наконец, когда у вас есть перечисление posts, я полагаю, что сам класс представляет собой одно сообщение, не так много, поэтому вам действительно нужен класс с именем Post, который вы можете сохранить в IEnumerable<Post>.

+0

Благодарим за короткий ответ. Ваше решение скрасит меня, я не думал об использовании IEnumerable T. О именах классов, это было только для этого примера, но да, я мог бы попробовать немного сложнее с выбором имени. – Harugawa

Смежные вопросы