2016-11-23 60 views
0

我有一個搜索表單,它在搜索目錄時接受多個單詞。當用戶搜索每個單詞長度大於等於3個字符的術語時,結果將按預期返回。但是,如果一個術語包含3個字符的單詞,它將返回更多的結果,這些結果對過濾器要求無效。使用Linq查詢返回無效結果的存儲庫

在我的資源庫中,我有下面的代碼,其中value傳入並且employees是DbSet。

var searchTerms = value.Split(' ') 
       .Select(v => v.Trim().ToLower()) 
       .ToList(); 

var data = this.employees 
       .Where(e => searchTerms.Any(s => e.fname.Contains(s)) || 
        searchTerms.Any(s => e.lname.Contains(s)) || 
        searchTerms.Any(s => e.dept.name.Contains(s)) || 
        e.dept.dept_subs 
         .Where(d => searchTerms 
          .Any(s => d.name.Contains(s))) 
           .Any()) 
       .Where(e => e.isActive == true) 
       .OrderBy(e => e.lname) 
       .ThenBy(e => e.fname) 
       .AsEnumerable(); 

所以問題仍然存在,爲什麼查詢打破兩個字符的單詞,我該如何解決它?

UPDATE

好。事實證明,它不限於2個字符。

結果格式如下。如果一個子部門是空的,它將只是名字行。

LastName, FirstName 
SubDepartment, Department 

搜索 '阿里' 返回

Adams, Nadiyah 
Logistics, Resources Directorate 

Ahmed, W*ali*ul 

爲 'JR'

Brooks, *Jr*, Cecil 
Customer Service Center, Program Administration Directorate 

Brown *Jr*, Peter 
Document Control and Data Management, Operations Directorate 

一個搜索 ''

搜索

更新2

正如意見中的要求,這裏有三大類:

public partial class dept 
{ 
    ctor() 
    public string name { get; set; } 
    public virtual ICollection<dept_sub> dept_subs { get; set; } 
    public virtual ICollection<employee> employees { get; set; } 
} 

public partial class dept_sub 
{ 
    ctor() 
    public string name { get; set; } 
    public int dept_id { get; set; }  
    public virtual dept dept { get; set; } 
    public virtual ICollection<employee> employees { get; set; } 
} 

public partial class employee 
{ 
    ctor()  
    public string fname { get; set; } 
    public string lname { get; set; } 
    public Nullable<int> dept_id { get; set; } 
    public Nullable<int> dept_sub_id { get; set; } 
    public virtual dept dept { get; set; } 
    public virtual dept_sub dept_sub { get; set; } 

} 
+1

你有一個樣本數據? – Bigeyes

+4

另外,如果'value'在單詞之間有多個空格,則最終會在'searchTerms'數組中找到一些空字符串,這將導致所有記錄匹配。 – wdosanjos

+0

如果你注意到,Nadiyah和Charles都不應該返回 – Ian

回答

0

@KMoussa和@ ZER0促使我尋找潛在的問題。我還實施了@wdosanjos推薦。

employee對象引用deptdept_sub。而不是去在周圍方法與employee要求dept_subdept它的名字,我重新路由查詢跳躍指揮鏈(因爲它映射),並調整查詢像下面。

我調整了代碼如下,它似乎返回更好的結果。

// trim off any whitespace on the ends 
string term = value.Trim(); 

// remove and replace extended spaces with a single space 
RegexOptions options = RegexOptions.None; 
Regex regex = new Regex("[ ]{2,}", options); 
term = regex.Replace(term, " "); 

// break down the property into a collection of strings 
List<string> searchTerms = term.Split(' ') 
    .Select(v => v.Trim().ToLower()) 
    .ToList(); 

// query the dbset 
IEnumerable<employee> data = this.employees 
    .Where(e => searchTerms.Any(s => e.fname.Contains(s)) || 
       searchTerms.Any(s => e.lname.Contains(s)) || 
       searchTerms.Any(s => e.dept.name.Contains(s)) || 
       searchTerms.Any(s => e.dept_sub.name.Contains(s))) // new line 
       // e.dept.dept_subs.Where(d => 
       //  searchTerms.Any(s => d.name.Contains(s))).Any()) 
    .Where(e => e.isActive == true) 
    .OrderBy(e => e.lname) 
    .ThenBy(e => e.fname);