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

C# 如何在linq中对非字符串字段使用过滤器?,c#,linq,entity-framework,C#,Linq,Entity Framework,我正在mvc应用程序中使用jquery datatables插件。过滤对字符串数据类型的字段非常有效。但是如果不先枚举结果,我就不能对非字符串字段进行过滤。这是我的密码 public List<MerchAgreementMain> getAgreementbyAccountNo(jQueryDataTableParamModel model) { var entity = new CCMSEntities(); var query = (

我正在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();
    }
公共列表getAgreementbyAccountNo(jQueryDataTableParamModel模型)
{
var entity=new CCMSEntities();
变量查询=(从实体中的_first.first
从实体中的_秒开始。秒
其中_first.No==_second.No
选择new MerchAgreementMain
{
AcctNo=\u Account.AcctNo,//数据类型长
busname=\u Account.busname,
CreatedBy=\u Account.CreatedBy,
CreationDate=\u Account.CreationDate??DateTime.MinValue,
状态=_Reflib.Descp
});
如果(model.sSearch!=null)
{
var x=query.AsEnumerable().Where(p=>Convert.ToString(p.AcctNo).Contains(model.sSearch)| p.busname.Contains(model.sSearch)| p.CreatedBy.Contains(model.sSearch)||
p、 Status.Contains(model.sSearch));
this.displayRecods=x.Count();
返回x.ToList();
}
//var result=query.ToPagedList(Convert.ToInt16(model.sEcho)、Convert.ToInt16(model.iDisplayLength));
返回query.ToList();
}
这个很好用。但问题是,在应用过滤器之前先枚举查询,数据库包含数千条记录;这似乎是一种不好的做法,在显示过滤结果之前可能需要一些延迟。如何在Iqueryable中长期应用过滤器?

而不是

query.AsEnumerable().Where(....
直接应用过滤器

query.Where(
请参阅:


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

我知道。但是我不能在Iqueryable中从字符串转换为long。这就是我枚举它的原因,这样我就可以按具有long数据类型的列进行筛选。