2017-01-02 40 views
0

表中有一個用於保存代表Property,Cars,Others的整數的類別的列。在各個欄目中搜索的最可維護的方式

有對下面這樣的關鍵字搜索屬性將重點放在屬性類型,州,縣,和NoOfBaths列顯示每個類別的興趣不同的列;而搜索汽車的關鍵詞則集中在品牌,型號,年份等等。

所有條目在所有列中的數據,但數據有時候可能有不同類別的含義稍有不同。例如,PropertyType列保存汽車的CarType數據和其他數據的ItemType數據,但是這些列僅在搜索屬性時纔有意義。

物業
屬性類型,
所在國,
位置縣,
沒有浴場

汽車的
製作,
型號,
年,
所在國

其他
ITEMNAME,
製作,
顏色,
所在國

感興趣的列被限制爲四個出於性能的考慮。像谷歌一樣,在用戶界面中使用單個搜索文本框。用於在查詢被觸發前預先識別用戶搜索類別的算法發佈了可接受的98%準確率。該算法還可以很好地猜測可能是顏色,州,縣等。 該網站起始於一個使用c#,實體框架,SQL服務器開發的小型廣告網站。

由於它被認爲是一個小項目,我想我可以使用LINQ把它關閉的實體。使用if語句消除空字段,它們是每個類別的有限數量的查詢(2的4次方)。

例如, 1

,爲queryHelper

NULL值之前where子句由查了一些房源。

通過我做的時候,我不知道,如果像這樣的小項目當之無愧的這種邏輯,即使它似乎更加靈活和易於維護。感興趣的列可以改變而不影響代碼。

的問題是,如果有一個更簡單的方法來實現這一目標?

其次,爲什麼沒有一個「可忽略()」在LINQ函數,使得where子句可以如果進行比較的值可以忽略的一個給定的部分爲空白或空?

例如,1體改

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

...

或符號,說「¬」,達到像這樣 例如,相同的。 1體改

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

...

回答

0

我覺得更容易,這樣做維護的方法是在特定的類overrided Equals()方法。因此,屬性中的任何更改都不需要改變Linq查詢。讓我用一個例子類的幫助說明這一點,讓它成爲類Cars考慮類的定義將是這樣的:

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); 
    } 
} 

現在讓objCars是你想在汽車用比較的對象。 context.Items那麼你可以格式化你的LINQ查詢是這樣的:

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

注:你可以給在Equals方法N一些條件,這樣就可以避開檢查爲空或空或什麼都埃爾斯e每次在執行LINQ之前或甚至在LINQ之前。很容易對類進行屬性更改,只需在超越方法中更改條件

+0

Cars objCars = new Cars(){model =「favmodel」,year =「2017」,locationState =「mystate」};在這種情況下,默認情況下objCars.make將爲null,並且返回(this.Make == other.Make)&& ...將返回汽車,其中make == NULL而不是省略make test,如 return(this.Model == other.Model)&& (this.Year == other.Year)&& (this.Location_State == other.Location_State); – user7363900

+0

正如我已經說過的,您可以修改條件以獲得更有效的比較 –

+0

使用Linq2Entities系統(如EntityFramework)時,不能重載等於 –

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