有效的方法来过滤IEnumerable并将其软件化为.NET中的JSON

时间:2015-11-09 17:43:05

标签: c# .net json ienumerable

我正在开发一个测试项目,该项目从DB读取数据,过滤结果,并将其作为JSON消息发送回DataTable。 10-15行数据大约需要5秒钟,所以我想知道这里可能有问题。 我在调试模式下检查了它,并看到以下这些行(过滤IEnum)花了这么长时间。

var result1 = new
{
    draw = Draw,
    recordsTotal = persons.Count(),
    recordsFiltered = persons.Count(),
    data = persons
    .Where(p => p.FName.Contains(sSearch, StringComparison.OrdinalIgnoreCase) || p.LName.Contains(sSearch, StringComparison.OrdinalIgnoreCase) || p.Id.ToString().Contains(sSearch, StringComparison.OrdinalIgnoreCase) || p.Email.Contains(sSearch, StringComparison.OrdinalIgnoreCase))
    .Select(p => new[] {p.Email,})
    .Skip(iDisplayStart)   
    .Take(iDisplayLength)
};

我删除了搜索部分(“where”)并再次测试,但仍然需要大约4.5秒。 需要大约1-2秒的另一件事是JSON序列化器:

var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(result1);
context.Response.ContentType = "application/json";
context.Response.Write(json);

如果您知道什么是最佳做法,请提供帮助。

1 个答案:

答案 0 :(得分:0)

不知道"人员"我确实会提出以下建议。

var result1 = new
{
    draw = Draw,
    recordsTotal = persons.Count(),
    recordsFiltered = (iDisplayLength - iDisplayStart),
    data = persons
        .Where(p => InString(p.FName) || InString(p.LName) || InString(p.Id.ToString()) || InString(p.Email))
        .Select(p => new { Email = p.Email }) //already a list, does not need to be an array of objects
        .Skip(iDisplayStart)   
        .Take(iDisplayLength)
        .ToList() //execute
};

//also consider an extension method
public bool InString(string prop, string search)
{
    return prop.Contains(search, StringComparison.OrdinalIgnoreCase)
}