• 关于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));
    }

    后台.cs页面:

    DataContextSetUp context = new DataContextSetUp();
    ISingleResult
    <STUDYSTAGE_SUBJECTGROUP__QRM> result = context.p_GetStudyStageSubjectGroup(DateTime.Now);

    this.ListView1.DataSource = result;
    this.ListView1.DataBind();

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

    查了国外的资料发现,因为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
    }

    详细可见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();

  • 相关阅读:
    VS停止调试,IIS Express也跟着关闭了
    会钓鱼的程序员
    彻底搞懂https原理
    Java小知识
    ORA-01000: 超出打开游标的最大数(java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误)
    虚拟机电脑重启后连接不上ORACLE
    电视直播源
    国内开源镜像站
    分享一波泰勒斯威夫特手机高清壁纸
    阿里云网盘内测申请
  • 原文地址:https://www.cnblogs.com/EricaMIN1987_IT/p/1943235.html
Copyright © 2020-2023  润新知