【问题标题】:Getting Stackoverflow exception when executing LINQ IQueryable method执行 LINQ IQueryable 方法时出现 Stackoverflow 异常
【发布时间】:2017-08-11 13:19:39
【问题描述】:

运行此代码时,会出现这样的 stackoverflow 异常

“System.StackOverflowException”类型的未处理异常 发生在 mscorlib.dll 中

    private IQueryable<KontratMasraflari> SKontratMasraflari()
    {
        var _kontratlar = SKontrat().ToList();//IQueryable Method
        List<KontratMasraflari> _tumMasraflar = new List<KontratMasraflari>();
        foreach (var kontrat in _kontratlar)
        {
            var _masraf = db.KontratMasraflaris.Where(x => x.KontratID == kontrat.ID).SingleOrDefault();
            if (_masraf == null)
                _tumMasraflar.Add(new KontratMasraflari()
                {
                    KontratID = kontrat.ID
                });
            else
                _tumMasraflar.Add(_masraf);
        } 
        var _result = PredicateBuilder.True<KontratMasraflari>();
        _result = _result.And(x => x.Silindi == 0);

        if (txtFirmaTuru.Text != string.Empty)
            _result = _result.And(x => x.FirmaTuru == txtFirmaTuru.Text);
        if (txtBelgeNo.Text != string.Empty)
            _result = _result.And(x => x.BelgeNumarasi == txtBelgeNo.Text);
        if (txtMasraf.Text != string.Empty)
            _result = _result.And(x => x.Masraf == txtMasraf.Text);
        if (txtGelirGider.Text != string.Empty)
            _result = _result.And(x => x.GelirGider == txtGelirGider.Text);

        //var _return = db.KontratMasraflaris.Where(_result); 
        return _tumMasraflar.AsQueryable().Where(_result);;
    }

【问题讨论】:

  • 你能得到有关堆栈的信息吗?这个方法是在某种递归链中调用的吗?
  • 我正在调用查找方法` var result2 = from k in SKontrat().DefaultIfEmpty() from m in SKontratMasraflari().DefaultIfEmpty().GroupBy(x => x.KontratID) where m .FirstOrDefault().KontratID == k.ID`
  • 在最后一行,你真的需要在_tumMasraflar上添加AsQueryable()吗? (它已经是一个列表..)
  • 我必须这样做。它不接受返回类型
  • 您可能正在递归调用该方法以获取 stackoverflow。我只想在第一行代码上设置一个断点,看看你是否不止一次到达断点。然后使用调用堆栈查找递归发生的位置。如果这不起作用,请检查是否有任何类具有应为静态的属性。

标签: c# linq iqueryable


【解决方案1】:

我会使用 LINQ 创建 List,然后只使用常规的 IQueryable Where

private IQueryable<KontratMasraflari> SKontratMasraflari() {
    var _kontratlar = SKontrat().ToList();//IQueryable Method
    var _tumMasraflar = SKontrat.GroupJoin(db.KontratMasraflaris, sk => sk.ID, km => km.KontratID, (sk, kmg) => kmg.Any() ? kmg.Single() : new KontratMasraflari { KontratID = sk.ID }).ToList();

    var _result = _tumMasraflar.Where(x => x.Silindi == 0);

    if (txtFirmaTuru.Text != string.Empty)
        _result = _result.Where(x => x.FirmaTuru == txtFirmaTuru.Text);
    if (txtBelgeNo.Text != string.Empty)
        _result = _result.Where(x => x.BelgeNumarasi == txtBelgeNo.Text);
    if (txtMasraf.Text != string.Empty)
        _result = _result.Where(x => x.Masraf == txtMasraf.Text);
    if (txtGelirGider.Text != string.Empty)
        _result = _result.Where(x => x.GelirGider == txtGelirGider.Text);

    //var _return = db.KontratMasraflaris.Where(_result); 
    return _result;
}

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 2014-05-23
    • 2016-09-06
    • 2013-03-27
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多