使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>

Posted

技术标签:

【中文标题】使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>【英文标题】:Using Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T> 【发布时间】:2011-11-30 01:01:23 【问题描述】:

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

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

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

以下是我认为正确的使用方法:

class MyPOCO : IResultSetMapper<MyPOCO>

    int    ID    get; set; 
    string Name  get; set;

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

请告诉我如何填写这个空白!如果我正确地解决了这个问题(通过让我的 POCO 实现 IResultSetMapper),或者我刚刚完成!

谢谢!

【问题讨论】:

【参考方案1】:

你真的需要使用IResultSetMapper&lt;T&gt;吗?您的 POCO 是否足够简单,可以使用 IRowMapper&lt;T&gt; 构建?如果您只有没有层次结构或嵌套集合等的简单对象,那么IRowMapper&lt;T&gt; 可能就足够了。尽管IResultSetMapper&lt;T&gt; 确实为您提供了最大的灵活性。

我不会让 POCO 实现 IResultSetMapper&lt;T&gt;。我会创建一个单独的映射器类。这消除了您的 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)
                ;
            
        
    

【讨论】:

【参考方案2】:

可能是这样的

 public IEnumerable<MyPOCO> MapSet(IDataReader reader)
 
     while(reader.Read())
     yield return new MyPOCO()
                 
                     ID = reader.GetInt(0),
                     Name = reader.GetString(1) 
                ;
 

如果您的查询看起来像“select ID,Name from ...”

【讨论】:

以上是关于使用 Microsoft.Practices.EnterpriseLibrary.Data IResultSetMapper<T>的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)