我从前端的搜索字段中获得了一个搜索字符串。我在View中搜索它的匹配项。到目前为止它的工作非常好。现在是时候对多个字段进行组合搜索,例如firstname
,lastname
,City
,Zip
和Street
,但订单并非总是如此相同。
那么当订单总是不一样的时候,如何在多列的视图中搜索呢?
我当前的代码看起来像这样
public object SearchCustomer(SearchString st)
{
DateTime dayOfBirth;
DateTime.TryParse(st.Content, out dayOfBirth);
var filteredQuery =
from pr in ctx.AllCustomerProcesses
where
pr.BirthDate1 == dayOfBirth
|| pr.BirthDate2 == dayOfBirth
|| pr.FirstName1.Contains(st.Content)
|| pr.LastName1.Contains(st.Content)
|| pr.FirstName2.Contains(st.Content)
|| pr.LastName2.Contains(st.Content)
|| pr.ProcessStatusDescription.Contains(st.Content)
|| (pr.LastName1 + " " + pr.FirstName1).Contains(st.Content)
|| (pr.FirstName1 + " " + pr.LastName1).Contains(st.Content)
|| (pr.LastName2 + " " + pr.FirstName2).Contains(st.Content)
|| (pr.FirstName2 + " " + pr.LastName2).Contains(st.Content)
orderby pr.CustomerID descending
select pr;
}
搜索5个属性的最佳和性能优化方法是什么?
(FirstName1
,LastName1
,Street
,Zip
,City
)。即使订单总是不相同或者没有给出某些属性,结果也必须匹配。
答案 0 :(得分:0)
使用SQL Server,搜索比LINQ要好得多。
在数据库中创建一个包含4列的表:主键,varchar值,列ID以及pr
表中主键的引用(可能是Foriegn Key)。
然后在值列上创建非聚集索引。
然后,您将使用此表存储一列中每个人的所有属性信息。 (上面指定的第二列)。
通过这种方式,您可以同时为所有属性划分索引。
您应该向pr
表添加触发器。这样,当您在pr
表中插入,更新或删除记录时,您也会自动在搜索表中插入,更新或删除行。
一般理念:
CREATE TABLE SearchTable (
SearchID INT IDENTITY PRIMARY KEY CLUSTERED
, SearchValue VARCHAR(MAX)
, MatchingColumnID INT
, PrRecordID INT
);
-- create nonclustered index
-- create triggers
CREATE PROCEDURE SearchRecords
@searchParam VARCHAR(50)
AS
DECLARE @searchString VARCHAR(52) = CONCAT('%', @searchParam, '%');
SELECT DISTINCT st.PrRecordID
FROM SearchTable AS st
WHERE st.SearchValue LIKE @searchString;
END