执行LINQ IQueryable方法时获取Stackoverflow异常

时间:2017-08-11 13:19:39

标签: c# linq iqueryable

运行此代码时,它会像这样获得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);;
    }

1 个答案:

答案 0 :(得分: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;
}