投射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 -method将从方法返回的每个实例强制转换为实际实例。

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

但是,如果您已经知道实际类型,为什么不在查询中使用它呢? 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;
    }
}

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

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

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因