2011-09-27 89 views
2

我試圖創造一個用戶有一個單一的「谷歌」式的查詢框,其搜索所有地址字段IE地址線1,城鎮,城市,郵編等簡單的地址屏幕像Linq的跨多個領域搜索

我正在使用.net和EF與SQL數據庫。我試過

IEnumerable<T> results = from x in dbSet 
         where (x.AddressLine1 + x.AddressLine2 + 
           x.AddressLine3 + x.Town + x.City + 
           x.County + x.Postcode).Contains(Query) 
         select x; 

這時候就應該不匹配任何結果。如果我將其更改爲

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) 
         select x; 

它匹配並返回結果,但顯然它不在所有字段中搜索。第一個問題,爲什麼我的第一個例子不工作,其次是這是實施這個的最好方法,還是會在壓力下掙扎。

+0

所有的'AddressLine1','AddressLine2',''''''類型''''''''''''''''''''' –

回答

3

試試這個會發生什麼:

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) || 
         x.AddressLine2.Contains(Query) || 
         x.AddressLine3.Contains(Query) || 
         x.Town.Contains(Query) || 
         x.City.Contains(Query) || 
         x.County.Contains(Query) || 
         x.Postcode 
         select x; 

對於更復雜的搜索使用LINQ,我用LinqKit

1

如果你使用這個

IEnumerable<T> results = from x in dbSet 
where x.AddressLine1.ToString().Contains(Query) || 
    x.AddressLine2.ToString().Contains(Query) || 
    x.AddressLine3.ToString().Contains(Query) || 
    x.Town.ToString().Contains.(Query)|| 
    x.City.ToString().Contains.(Query) || 
    x.Postcode.ToString().Contains(Query) 
select x; 
2

您當前的做法需要進行全表掃描每行有一些子字符串匹配操作 - 我無法想象這是在大型表上執行的。你真正應該做的是使用SQL全文。在EF中沒有對此的本機支持,但可以使用存儲過程或存儲查詢。