gpt4 book ai didi

c# - 提高自动完成 LINQ 查询的性能

转载 作者:太空宇宙 更新时间:2023-11-03 20:12:20 25 4
gpt4 key购买 nike

我对我的自动完成进行了一些大规模的搜索,想知道是否有人可以提供任何改进性能的想法。

发生了什么:

1) 在应用程序启动时,我将所有数据库条目保存在内存中。

2) 用户在搜索框中键入以启动自动完成:

$("#MatterCode").width(110).kendoAutoComplete({
minLength: 3,
delay: 10,
dataTextField: "MatterCode",
template: '<div class="autoCompleteResultsCode"> ${ data.ClientCode } - ${ data.MatterCode } - ${ data.ClientName } - ${ data.MatterName }</div>',
dataSource: {
serverFiltering: true,
transport: {
read: "/api/matter/AutoCompleteByCode",
parameterMap: function() {
var matterCode = $("#MatterCode").val();
return { searchText: matterCode };
}
}
}, //More Stuff here

3) 它转到我的 Controller 类:

public JsonResult AutoCompleteByCode(string searchText)
{
if (string.IsNullOrEmpty(searchText))
{
Response.StatusCode = 500;
return Json(new
{
Error = "search string can't be empty"
});
}

var results = _publishedData.GetMattersForAutoCompleteByCode(searchText).Select(
matter => new
{
MatterCode = matter.Code,
MatterName = matter.Name,
ClientCode = matter.Client.Code,
ClientName = matter.Client.Name
});
return Json(results);
}

4) 进入 DAL(以 '_' 开头的对象是内存对象)

public virtual IEnumerable<Matter> GetMattersForAutoCompleteByCode(string input)
{
InvalidateCache();
IEnumerable<Matter> results;
//Searching Matter Object on all 4 given parameters by input.

if (_lastMatters != null && input.StartsWith(_lastSearch) && _lastMatters.Any())
{
results = _lastMatters.Where(m => m.IsInputLike(input)).OrderBy(m => m.Code);
_lastMatters = results;
}
else
{
results = _matters.Where(m => m.IsInputLike(input)).OrderBy(m => m.Code);
_lastMatters = results;
}

_lastSearch = input;

return results.Take(10).ToList();
}

5) isInputLike 是一个内部 bool 方法

internal bool IsInputLike(string input)
{
//Check to see if the input statement exists in any of the 4 fields
bool check = (Code.ToLower().Contains(input.Trim().ToLower())
|| Name.ToLower().Contains(input.Trim().ToLower())
|| ClientCode.ToLower().Contains(input.Trim().ToLower())
|| ClientName.ToLower().Contains(input.Trim().ToLower()));

return check;
}

现在,我必须处理的结果集可能超过 100,000 个。现在,任何新查询的第一个自动完成都必须搜索 400,000 条记录,我想不出一种在不牺牲功能的情况下提高性能的方法。

有什么想法吗?SQL 存储过程调用是否比 LINQ 更快?

最佳答案

我认为这里的主要问题是您首先将 400k 对象放入内存。SQL 并没有那么慢,最好从有限的数据集开始。

一个明显的优化是:

internal bool IsInputLike(string input)
{
string input = input.Trim().ToLower();
//Check to see if the input statement exists in any of the 4 fields
bool check = (Code.ToLower().Contains(input)
|| Name.ToLower().Contains(input)
|| ClientCode.ToLower().Contains(input)
|| ClientName.ToLower().Contains(input));

return check;
}

但就个人而言,我会将数据保存在它所属的位置,在 SQL 服务器中(如果您使用的是 SQL 服务器)。一些索引和适当的查询可以使这更快。

当我看到这段代码时,我开始疑惑:

public virtual IEnumerable<Matter> GetMattersForAutoCompleteByCode(string input)
{
InvalidateCache();
IEnumerable<Matter> results;
//Searching Matter Object on all 4 given parameters by input.

if (_lastMatters != null && input.StartsWith(_lastSearch) && _lastMatters.Any())
{
results = _lastMatters.Where(m => m.IsInputLike(input)).OrderBy(m => m.Code);
_lastMatters = results;
}
else
{
results = _matters.Where(m => m.IsInputLike(input)).OrderBy(m => m.Code);
_lastMatters = results;
}

_lastSearch = input;

return results.Take(10).ToList();
}

为什么需要订购?为什么下拉自动完成需要过滤 4 个项目?如果你只拿 10 个,你就不能不点吗?查看删除 orderby 是否会给您带来更好的结果,尤其是在您将获得很多结果的 else 语句中。

就我个人而言,我会全力以赴使用 LINQ to SQL,让 SQL 服务器进行搜索。优化此表的索引,它会更快。

关于c# - 提高自动完成 LINQ 查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19260786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com