使用自定义类转换IEnumerable <dynamic>

Har*_*awa 3 c# ienumerable casting dapper

我最近一直在使用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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

这里叫功能:

IEnumerable<posts> = Method.QueryAll("posts");
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts.

我该怎么做才能让它发挥作用.

Him*_*ere 5

从技术上讲,您可以使用IEnumerable.Cast-method将从方法返回的每个实例转换为实际实例.

IEnumerable<posts> = Method.QueryAll("posts").Cast<posts>();
Run Code Online (Sandbox Code Playgroud)

但是,如果您已经知道实际类型,为什么不在查询中使用它?dynamic应该谨慎处理,只有你真的必须这样做,我怀疑是这样的.例如,您可以将实际类型作为type-parameter添加到方法中:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以按如下方式调用它:

var result = Method.QueryAll<posts>("posts");
Run Code Online (Sandbox Code Playgroud)

另外,Method一个非常糟糕的类名posts也是如此.您应该提供您的班级名称,以描述他们所服务的内容以及他们正在做的事情.此外,还有一些命名约定建议使用PascalCase-names来创建类Posts.最后,当你有一个枚举时posts,我想这个类本身代表一个帖子,而不是很多,所以你实际上想要一个名为Post你可以存储的类IEnumerable<Post>.