在 .NET 中过滤 IEnumerable 并将其序列化为 JSON 的有效方法

Efficient way to filter IEnumerable and serilize it to JSON in .NET

我正在开发一个测试项目,该项目从 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 serializer:

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

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

不知道 "persons" 到底是什么,我只想提出以下建议。

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)
}