如何在linq中使用过滤器来对付非字符串字段?

时间:2012-11-30 10:16:45

标签: c# linq entity-framework

我在我的mvc应用程序中使用了jquery datatables插件。过滤与字符串数据类型的字段完美匹配。但我不能使用过滤非字符串字段而不首先枚举结果。这是我的代码。

 public  List<MerchAgreementMain> getAgreementbyAccountNo(jQueryDataTableParamModel model)
    {
        var entity = new CCMSEntities();
        var query = (from _first in entity.First
                     from _second in entity.Second
                     where _first.No == _second.No 
        select new MerchAgreementMain
                     {
                         AcctNo = _Account.AcctNo,   // datatype long
                         BusnName = _Account.BusnName,
                         CreatedBy = _Account.CreatedBy,  
                         CreationDate = _Account.CreationDate ?? DateTime.MinValue,  
                         Status = _Reflib.Descp
                     });
        if (model.sSearch != null)
        {
            var x = query.AsEnumerable().Where(p => Convert.ToString(p.AcctNo).Contains(model.sSearch) || p.BusnName.Contains(model.sSearch) || p.CreatedBy.Contains(model.sSearch)||
                p.Status.Contains(model.sSearch));
          this.displayRecods = x.Count();
           return x.ToList();
        }
        //var result = query.ToPagedList(Convert.ToInt16(model.sEcho),Convert.ToInt16(model.iDisplayLength));
        return query.ToList();
    }

这很好用。但问题是在应用过滤器之前首先枚举查询,并且数据库包含数千条记录;这似乎是一种不好的做法,在显示过滤结果之前可能需要一些延迟。如何在Iqueryable中长时间应用过滤器?

1 个答案:

答案 0 :(得分:2)

而不是

query.AsEnumerable().Where(....

直接应用过滤器。

query.Where(

请参阅:IQueryable vs. IEnumerable in terms of LINQ to SQL queries

由于您正在执行AsEnumerable,因此您的查询首先进行迭代,然后应用过滤器。如果您应用不带AsEnumerable的过滤器,则查询为IQueryable,并且仅在迭代结果集时才会应用过滤器。