zoukankan      html  css  js  c++  java
  • 关于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
  • 相关阅读:
    【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息
    本学习笔记TCP/IP传输协议
    iOS_23_undress Girl
    uva 1560
    IOS开发-Swift新语言初见
    39个让你受益的HTML5教程
    ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录
    怎样使用SetTimer MFC 够具体
    ArcGIS API for Silverlight 编辑Geometry
    几种更新(Update语句)查询的方法
  • 原文地址:https://www.cnblogs.com/weixing/p/4794163.html
Copyright © 2011-2022 走看看