关于linq to sql调用存储过程,出现"无法枚举查询结果多次"的问题

DBML:

[Function(Name="dbo.p_GetStudyStageSubjectGroup")]
 public ISingleResult<STUDYSTAGE_SUBJECTGROUP__QRM> p_GetStudyStageSubjectGroup([Parameter(Name = "TimePoints", DbType = "DateTime")] System.Nullable<System.DateTime> timePoints)
 {
     IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), timePoints);
     return ((ISingleResult<STUDYSTAGE_SUBJECTGROUP__QRM>)(result.ReturnValue));
 }
View Code

后台.cs页面:

DataContextSetUp context = new DataContextSetUp();ISingleResult<STUDYSTAGE_SUBJECTGROUP__QRM> result = context.p_GetStudyStageSubjectGroup(DateTime.Now);                        this.ListView1.DataSource = result;this.ListView1.DataBind();
View Code

运行会报错:“无法枚举查询结果多次。”

查了国外的资料发现,因为linq to sql的ISingleResult<T>输出不能被列举计算大于1次。

比如当你绑定ISingleResult<T>到一个下拉框列表,结果被枚举计算并且下拉框增加了数据;然后如果你再次绑定同样的ISingleResult<T>实例到同一个控件,它会发现它的数据源和先前的一样(通过对象引用参照),最后它就不会再一次的枚举计算该ISingleResult<T>实例。

 

为了解决这个问题,现有两种方法可以提供:

1、实现自己的ISingleResult<T>

public class WrapperResult<T> : ISingleResult<T>
    {
        #region Fields

        List<T> results;
        object returnValue;

        #endregion

        #region Constructor

        public WrapperResult(ISingleResult<T> inner)
        {
            results = inner.ToList();
            returnValue = inner.ReturnValue;
        }

        #endregion

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            return results.GetEnumerator();
        }

        #endregion

        #region IEnumerable Members

        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable)results).GetEnumerator();
        }

        #endregion

        #region IFunctionResult Members

        public object ReturnValue
        {
            get { return returnValue; }
        }

        #endregion

        #region IDisposable Members

        public void Dispose()
        {
        }

        #endregion
    }
View Code

详细可见http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/f403e047-e38c-45ab-9155-dbf83c6cc2fa

2、直接把ISingleResult<T>转换为.toList<T>()

DataContextSetUp context = new DataContextSetUp();List<STUDYSTAGE_SUBJECTGROUP__QRM> result = context.p_GetStudyStageSubjectGroup(DateTime.Now).ToList();                       this.ListView1.DataSource = result;this.ListView1.DataBind();
View Code

 

posted @ 2015-09-09 11:37  无恨星晨  阅读(1789)  评论(0编辑  收藏  举报