如何改进 LINQ 查询
How to improve LINQ query
我正在开发一个用户可以按类别过滤记录的应用程序。
一条记录必须有 1 个,但可以有多个类别。 (1-*)
我的问题是,我可以做些什么来改进这个搜索?由于以下原因,它目前的运行时间约为 O(n^3):
一个交易可能有很多记录(1-many)
一条记录可能有很多类别(1-many)
遍历为搜索选择的类别
我正在做的事情的基本轮廓如下:
retrieve all announcements
if(startDate and endDate have values)
model = model.Where(x => x.WADate >= start.Value && x.WADate <= end.Value).ToList();
if(queryString is not null)
model = model.Where(
x => x.WANum.Contains(query) ||
x.Tooltip.ToLower(CultureInfo.InvariantCulture).Contains(query)
|| x.Topic.ToLower(CultureInfo.InvariantCulture).Contains(query)
).ToList();
if (selectedCategories.Count > 0)
{
bool HasMatch;
foreach (var ancmt in announcements)
{
HasMatch = false;
foreach (var cat in selectedCategories)
{
foreach (var xref in ancmt.waXref)
{
if (cat.ID == xref.WACategoryID)
{
HasMatch = true;
}
}
}
if(HasMatch)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
}
// If no catgories were selected, keep all announcements for next stage of search
else
{
foreach (var ancmt in announcements)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
我使用的是方法语法,而不是查询,我更喜欢使用方法语法。
为了获得真正的性能提升,最好创建特定的存储过程来处理数据库中真正繁重的处理,而不是在客户端 PC 上。
我正在开发一个用户可以按类别过滤记录的应用程序。
一条记录必须有 1 个,但可以有多个类别。 (1-*)
我的问题是,我可以做些什么来改进这个搜索?由于以下原因,它目前的运行时间约为 O(n^3):
一个交易可能有很多记录(1-many) 一条记录可能有很多类别(1-many) 遍历为搜索选择的类别
我正在做的事情的基本轮廓如下:
retrieve all announcements
if(startDate and endDate have values)
model = model.Where(x => x.WADate >= start.Value && x.WADate <= end.Value).ToList();
if(queryString is not null)
model = model.Where(
x => x.WANum.Contains(query) ||
x.Tooltip.ToLower(CultureInfo.InvariantCulture).Contains(query)
|| x.Topic.ToLower(CultureInfo.InvariantCulture).Contains(query)
).ToList();
if (selectedCategories.Count > 0)
{
bool HasMatch;
foreach (var ancmt in announcements)
{
HasMatch = false;
foreach (var cat in selectedCategories)
{
foreach (var xref in ancmt.waXref)
{
if (cat.ID == xref.WACategoryID)
{
HasMatch = true;
}
}
}
if(HasMatch)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
}
// If no catgories were selected, keep all announcements for next stage of search
else
{
foreach (var ancmt in announcements)
{
model.Add(new EditViewModel
{
WATypeID = ancmt.WATypeID,
WANum = ancmt.WANum,
WATypeName = ancmt.waType.WATypeDescription,
Link = ancmt.Link,
Tooltip = ancmt.Tooltip,
Topic = ancmt.Topic,
WADate = ancmt.WADate,
WAID = ancmt.WAID,
});
ancmt.waXref.ToList().ForEach(
x => model.Last().Categories.Add(
new CategoryViewModel { ID = x.WACategoryID, Name = x.waCategory.WACategory, IsSelected = false }));
}
}
我使用的是方法语法,而不是查询,我更喜欢使用方法语法。
为了获得真正的性能提升,最好创建特定的存储过程来处理数据库中真正繁重的处理,而不是在客户端 PC 上。