使用Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper <t> </t>

时间:2011-10-03 15:47:17

标签: c# ado.net enterprise-library data-access-layer

我没有滚动自己的ADO.Net帮助程序类,而是决定让Microsoft.Practices.EnterpriseLibrary旋转。查看文档和示例项目,我真的很喜欢我所看到的内容。

对于我的项目,我将调用所有数据访问的存储过程。特别是,我将严重依赖 ExecuteSprocAccessor&lt; TResult&gt; 方法。

我的问题涉及使用 IResultSetMapper&lt; T&gt; 界面。文档说实现此接口的类必须实现方法 MapSet(reader:IDataReader):IEnumerable&lt; T&gt; 不幸的是,我找不到任何如何实现这个的例子方法

以下是我假设使用它的正确方法:

class MyPOCO : IResultSetMapper<MyPOCO>
{
    int    ID   { get; set; }
    string Name { get; set;}

    public IEnumerable<MyPOCO> MapSet(IDataReader reader)
    {
        // HELP ME HERE! PLEASE!
    }
}

请告诉我如何填写这个空白!如果我正确地进行此操作(通过让我的POCO实现 IResultSetMapper )或者我只是离开了!

谢谢!

2 个答案:

答案 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,名称来自......”