2017-01-02 4 views
0

テーブルには、プロパティ、車、その他を表す整数を保持するカテゴリの列があります。さまざまな列を検索する最も保守的な方法

プロパティを検索するキーワードがPropertyType、State、County、およびNoOfBathsの列に焦点を当てるように、以下に示すカテゴリごとに異なる列があります。自動車のキーワード検索は、モデル、モデル、年などに重点を置いています。

すべてのエントリにはすべての列にデータが含まれていますが、データによってはカテゴリによって若干異なる意味があることがあります。たとえば、PropertyType列は車のCarTypeデータと他の列のItemTypeデータを保持しますが、列はプロパティを検索するときにのみ重要です。

プロパティ
PropertyTypeは、
ロケーションステート、
場所郡、
浴場

車のない
メイク、
モデル、
年、
ロケーションステート

その他
ITEMNAME、
メイク、
カラー、関心の

列がパフォーマンス上の理由のために4つに限定された
ロケーションステート。 1つの検索テキストボックスは、GoogleのようにUIで使用されます。クエリが実行される前にユーザーの検索カテゴリを事前に識別するために使用されるアルゴリズムは、許容可能な98%の精度を示します。アルゴリズムはまた、色、州、郡などが何であるかを推測します。 サイトは、C#、エンティティフレームワーク、SQLサーバを使用して開発された小さな広告サイトとして開始されました。

私は小さなプロジェクトとして考えていたので、私はlinqでエンティティにそれを取り除くことができると思った。 if文を使用してヌルフィールドを削除すると、各カテゴリの有限数のクエリ(2のべき乗から4まで)でした。

例: 1

とNULL値が句が構成されている前にチェックされているqueryHelper

のためのいくつかのリスト。

私がやったときは、柔軟性と保守性に優れているとはいえ、このような小さなプロジェクトがこの種の論理にふさわしいかどうかは不明でした。関心のある列は、コードに影響を与えることなく変更できます。

これを達成するより簡単な方法があるのでしょうか?

第2に、linqに 'Ignorable()'関数がないため、比較される値がnullまたは空の場合にwhere句の指定部分を無視できるのはなぜですか?

例:1は

var results = context.Items.Where(m=>m.make.Ignorable() == make && 
m.model.Ignorable() == model && m.year.Ignorable() ==year && 
m.state.Ignorable() == state); 

...

または記号をmodifed、「¬」と言うので、 例:のような同じことを達成します。 1は、私がこれを行うためにはるかに簡単で保守方法は、特定のクラスでoverrided Equals()方法だと思います

var results = context.Items.Where(m=>m.make ¬== make && m.model ¬== model 
&& m.year ¬==year && m.state ¬== state); 

...

答えて

0

をmodifed。そのため、プロパティの変更によってLinqクエリが変更される必要はありません。今objCarsはあなたが車と比較したいオブジェクトでみましょう

public class Cars 
{  
    // Properties  
    public string Make { get; set; } 
    public string Model { get; set; } 
    public int Year { get; set; } 
    public string Location_State { get; set; } 

    // overrided Equals method definition 
    public override bool Equals(object obj) 
    { 
     return this.Equals(obj as Cars); 
    } 
    public bool Equals(Cars other) 
    { 
     if (other == null) 
      return false; 
     return (this.Make == other.Make) && 
       (this.Model == other.Model) && 
       (this.Year == other.Year) && 
       (this.Location_State == other.Location_State); 
    } 
} 

:それはCarsは、クラスの定義は次のようになります考慮するクラスになりましょう、私は例クラスの助けを借りてこれを説明してみましょうcontext.ItemsあなたはこのようなあなたのLINQクエリフォーマットすることができます:

context.Items.Where(m=> m.Equals(objCars)); 

注:あなたがチェックを避けることができるようにあなたがEquals方法における条件のN数を与えることができますがnullまたは空であるか、またはこれまでにELS何LINQを実行する前に、またはLINQを実行する前に、毎回。クラスにプロパティを簡単に変更した場合、オーバーライドされたメソッドの条件を変更する必要があります。

+0

車objCars =新しいCars(){model = "favmodel"、year = "2017"、locationState = "mystate"};この場合、objCars.makeはデフォルトでnullになり、返されます(this.Make == other.Make)&& ... return(this.Model)のようにmakeテストを省略するのではなく、make == NULLの場所に戻ります。 == other.Model)&& (this.Year == other.Year)&& (this.Location_State == other.Location_State); – user7363900

+0

すでに述べたように、条件を変更して比較を効果的に行うことができます。 –

+0

EntityFrameworkのようなLinq2Entitiesシステムを使用するときは、equalsをオーバーロードできません –

0
var q = context.Items; 
     if (!string.IsNullOrEmpty(make)) 
     { 
      q = q.Where(m => m.make == make); 
     } 
     if (!string.IsNullOrEmpty(model)) 
     { 
      q = q.Where(m => m.model == model); 
     } 
     //. . . 

     var results = q.ToList(); 

クエリは実行前に複数の行で操作できます。 here

関連する問題