2010-09-07 65 views
6

我一直在用這個撕掉我的頭髮。我有一個搜索條件數組,我正在嘗試執行LINQ to SQL查詢來針對數組中的每個項搜索字段值。LINQ to SQL查詢幫助(字符串包含字符串數組中的任何字符串)

我能走到今天..

var searchResults = 
    from x in SDC.Staff_Persons 
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Surname.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Known_as.Contains(pinq)) 
    orderby x.Surname 
    select x; 

...但隨後得到

本地序列不能在LINQ 用於執行SQL查詢的 運營商除了載有() 運營商

...現在我卡住了。

如果有人能幫忙,我會非常感激。 在此先感謝。

羅布

回答

5

我不知道這是最簡單的解決方案,但是這將工作:

var filter = CreateFilter(staffTermArray); 

var searchResults = 
    from person in SDC.Staff_Persons.Where(filter) 
    orderby person.Surname 
    select person; 



private static Expression<Func<Staff_Person, bool>> CreateFilter(
    string[] staffTermArray) 
{ 
    var predicate = PredicateBuilder.False<Staff_Person>(); 

    foreach (var staffTerm in staffTermArray) 
    { 
     // We need to make a local copy because of C# weirdness. 
     var ping = staffTerm; 

     predicate = predicate.Or(p => p.Forename.Contains(ping)); 
     predicate = predicate.Or(p => p.Surname.Contains(ping)); 
     predicate = predicate.Or(p => p.Known_as.Contains(ping)); 
    } 

    return predicate; 
} 

您將需要PredicateBuilder這個工作。

+0

哇 - 我在搜索解決方案時遇到了術語'謂詞構建器',但沒有人用這麼簡單的術語解釋它!非常感謝你!! – LiverpoolsNumber9 2010-09-07 11:29:11

-1

一種選擇是在客戶端而不是SQL中進行過濾。您可以通過致電AsEnumerable()來強制where在客戶端進行評估。但是,這意味着表中的每一行都會在測試匹配之前加載到內存中,因此如果您的搜索僅匹配大表中的少量結果,那麼可能無法接受低效率。

var allPersons = 
    from x in SDC.Staff_Persons 
    orderby x.Surname 
    select x; 

var searchResults = 
    from x in allPersons.AsEnumerable() 
    where staffTermArray.Any(pinq => x.Forename.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Surname.Contains(pinq)) 
     || staffTermArray.Any(pinq => x.Known_as.Contains(pinq)) 
    select x; 
+0

是的,我確實有這個想法,實際上它只有1200條記錄,所以不會太糟糕。但是我的加載時OCD正在阻止我... :) – LiverpoolsNumber9 2010-09-07 11:10:39

+0

問題可能是這對一個小測試數據庫很有效,但是一旦客戶端獲得更大的數據,它將失敗光榮。我遇到了一個案例,我們正在瀏覽一個有480萬行的日誌表並加載它,然後過濾不是一個選項。 – MBentley 2016-02-26 18:00:24

相關問題