2017-08-17 75 views
0

我從前端的搜索字段中搜索了一個搜索字符串。我在視圖中搜索它的匹配。到目前爲止,它的工作非常好。現在是對多個字段進行組合搜索的時間,如firstname,lastname,City,ZipStreet,但順序並不總是相同。 那麼,如何在多列的視圖中搜索訂單時不是一樣的?c#在多列中搜索

我現在codesnipped看起來像這樣

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,LastName1Street,ZipCity)。即使訂單不完全相同或者沒有給出某些屬性,結果也必須匹配。

+0

它'(pr.LastName1 + 「」 + pr.FirstName1)。載有(st.Content)'有道理呢?是否有很多要求尋找「onald Trum」的請求? – ASpirin

+0

你對@MBurnham的回答滿意嗎?如果沒有,留下評論,我會用Linq發佈一個答案:)如果不是:你需要的對象,它符合你的標準作爲返回類型,或者你只想知道標準是否匹配? – Joshit

回答

0

使用SQL Server,它將比LINQ更好地搜索。

在您的數據庫中創建一個包含4列的表:pr表中主鍵的主鍵,varchar值,列ID和引用(可能是Foriegn鍵)。

然後在值列上創建一個非聚集索引。

然後,您將使用此表將每個人的所有屬性信息存儲在一列中。 (上面指定的第二列)。

這樣你就可以同時爲所有屬性指定一個索引。

您應該爲您的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