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