我没有滚动自己的ADO.Net帮助程序类,而是决定让Microsoft.Practices.EnterpriseLibrary旋转。查看文档和示例项目,我真的很喜欢我所看到的内容。
对于我的项目,我将调用所有数据访问的存储过程。特别是,我将严重依赖 ExecuteSprocAccessor< TResult> 方法。
我的问题涉及使用 IResultSetMapper< T> 界面。文档说实现此接口的类必须实现方法 MapSet(reader:IDataReader):IEnumerable< T> 不幸的是,我找不到任何如何实现这个的例子方法
以下是我假设使用它的正确方法:
class MyPOCO : IResultSetMapper<MyPOCO>
{
int ID { get; set; }
string Name { get; set;}
public IEnumerable<MyPOCO> MapSet(IDataReader reader)
{
// HELP ME HERE! PLEASE!
}
}
请告诉我如何填写这个空白!如果我正确地进行此操作(通过让我的POCO实现 IResultSetMapper )或者我只是离开了!
谢谢!
答案 0 :(得分:2)
你真的需要使用IResultSetMapper<T>
吗?您的POCO是否足够简单,可以使用IRowMapper<T>
构建?如果您只有简单的对象而没有层次结构或嵌套集合等,那么IRowMapper<T>
可能就足够了。虽然IResultSetMapper<T>
确实为您提供了最大的灵活性。
我没有POCO实施IResultSetMapper<T>
。我会创建一个单独的映射器类。这消除了POCO类对Enterprise Library的依赖性。此外,POCO类现在独立于映射。您可以更改映射或映射器,而不会影响POCO。
public class MyPocoMapper : IResultSetMapper<MyPoco>
{
public IEnumerable<MyPoco> MapSet ( IDataReader reader )
{
using(reader) // Dispose the reader when we're done
{
while (reader.Read())
{
yield return new MyPoco()
{
MyProperty1 = reader.GetString(
reader.GetOrdinal("MyPropertyX")),
MyProperty2 = reader.GetString(1)
};
}
}
}
}
答案 1 :(得分:1)
也许就像这样
public IEnumerable<MyPOCO> MapSet(IDataReader reader)
{
while(reader.Read())
yield return new MyPOCO()
{
ID = reader.GetInt(0),
Name = reader.GetString(1)
};
}
如果您的查询看起来像“选择ID,名称来自......”