c#搜索多列

时间:2017-08-17 12:52:48

标签: c# sql-server linq

我从前端的搜索字段中获得了一个搜索字符串。我在View中搜索它的匹配项。到目前为止它的工作非常好。现在是时候对多个字段进行组合搜索,例如firstnamelastnameCityZipStreet,但订单并非总是如此相同。 那么当订单总是不一样的时候,如何在多列的视图中搜索呢?

我当前的代码看起来像这样

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个属性的最佳和性能优化方法是什么? (FirstName1LastName1StreetZipCity)。即使订单总是不相同或者没有给出某些属性,结果也必须匹配。

1 个答案:

答案 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