我最近一直在使用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
。
如何施展它以使其发挥作用。
答案 0 :(得分:5)
从技术上讲,您可以使用IEnumerable.Cast
- 方法将从方法返回的每个实例强制转换为实际实例。
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
- 用于制作课程Posts
的课程的名称。最后当你有一个posts
的枚举时,我想这个类本身代表一个帖子,而不是很多,所以你实际上想要一个名为Post
的类,你可以将它存储到IEnumerable<Post>
中