2017-08-17 16 views
0

Frontendの検索フィールドから検索文字列を取得しました。私はそれが一致のためのビューで検索します。これまでのところ極端にうまく動作します。今度はfirstnamelastnameCityZipStreetのような複数のフィールドを組み合わせて検索する時間ですが、その順序は同じではありません。 注文がすべて同じでない場合は、複数の列のビューでどのように検索できますか?私の現在のcodesnippedこの複数の列でのC#検索

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

はそれをしない '(pr.LastName1 + "" + pr.FirstName1).Contains(st.Contentは)'全く理にかなっていますか? "onald Trum"を探すことがたくさんありますか? – ASpirin

+0

@MBurnhamの回答に満足していますか?そうでない場合は、コメントを残して、私はLinqと答えを投稿します:)そして、そうでない場合:あなたの基準に戻り値の型として一致するオブジェクトが必要ですか、または基準が一致するかどうかを知りたいだけですか? – Joshit

答えて

0

SQL Serverを使用すると、LINQより検索する方がはるかに優れています。

プライマリキー、varchar値、カラムID、およびprテーブルのプライマリキーへの参照(場合によってはフォーリンキー)の4つのカラムを持つテーブルをデータベースに作成します。

次に、値列にノンクラスタード・インデックスを作成します。

この表を使用して、各人物のすべての属性情報を1つの列に格納します。 (上記の2番目の列)。

こうすれば、すべての属性のインデックスをすぐに活用できます。

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