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.
我该怎么做才能让它发挥作用.
从技术上讲,您可以使用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>.
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |