Литье IEnumerable с пользовательским классом

c# casting dapper ienumerable

Вопрос

В последнее время я использую dapper и хочу сделать динамический метод, который упростит выбор содержимого с помощью sql. Это мой код:

Класс:

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 .

Как я могу заставить его работать.

Принятый ответ

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

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

Однако, если вы уже знаете фактический тип, почему бы не использовать его в запросе 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 -names для класса сделать свой класс Posts . Наконец, когда у вас есть перечисление posts , я полагаю, что сам класс представляет собой одно сообщение, а не много, поэтому вам действительно нужен класс с именем Post который вы можете сохранить в IEnumerable<Post> .



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow