2012-11-30 58 views
2

我正在嘗試針對EF實體類型(人)創建一個通用搜索查詢。通常,搜索需要一個字符串,用逗號分割,然後搜索各種屬性包含所有關鍵字的人員。如何在linq where子句中使用函數的返回值?

我有一個函數調用的GetProperties(人員P),其採用實體(由實體類型覆蓋),並返回相關的各種屬性的字符串用分隔符連接在一起...如:

John~Doe~Team A~Full Time 

如果用戶搜索與上述扁平化實體相對應的「團隊A,完整」人員應該返回......但是,如果輸入「John,Smith」,則不應該。

我認爲有以下期待權,但它只是不工作...

public IEnumerable<Person> SearchPeople(string searchString) 
{ 
    if (searchString == null || string.IsNullOrEmpty(searchString.Trim())) 
     return base._objectSet.ToList(); 

    string[] SearchWords = searchString.Split(',').Select(s => s.Trim()).ToArray(); 

    return (from person 
      in  base._objectSet 
      let  t = (getProperties(person)) 
      where SearchWords.All(word => t.Contains(word)) 
      select person).ToList(); 
} 

和GetProperties中的功能是:

public static string getProperties(Person p) 
{ 
    string[] values = { p.Surname, p.GivenName, p.Team, p.Status }; 
    return values.Aggregate((x, y) => String.IsNullOrEmpty(y) ? x : string.Concat(x, "~", y)); 
} 

有誰看到我要去哪裏錯了?

編輯

沒有異常升高,但是當我通過代碼,當我到了LINQ,它便在承載查詢的UnitOfWork的Dispose方法。很奇怪。

如果我改變它,這樣它搜索對一個硬編碼字符串,它按預期工作:

var test = (from person 
      in  base._objectSet 
      where SearchWords.All(word => "John~Doe~Team A~Full Time".Contains(word)) 
      select person).ToList(); 

好,它的工作原理,它期望它的查詢相匹配,但因爲它是靜態的,它返回每個人的記錄(很像有地方(真)= P)

編輯第二

更奇怪的是,如果我存儲結果到一個變種,然後用返回的VAR Retu上的斷點執行從未到達斷點......這個linq就像一個黑洞......我可以進入它,但它永遠不會讓我回到我的SearchPeople方法......它只是放置上下文並忘記它。

編輯第三

如果我不叫的ToString()馬上看看在調試器中的LINQ表達式,它說:「LINQ到實體無法識別方法GetProperties(人)」看上去就像它無聲地窒息了我的方法...任何方式來使用我的方法沒有LINQ窒息它?

+4

你能解釋爲什麼'它不起作用?' –

回答

0

您正在返回一個列表?嘗試返回類型是一個列表或改變.ToList()AsEnumerable()

public List<Person> SearchPeople(string searchString) 
{ 
    if (searchString == null || string.IsNullOrEmpty(searchString.Trim())) 
     return base._objectSet.ToList(); 

    string[] SearchWords = searchString.Split(',').Select(s => s.Trim()).ToArray(); 

    return (from person 
      in  base._objectSet 
      let  t = (getProperties(person)) 
      where SearchWords.All(word => t.Contains(word)) 
      select person).ToList(); 
} 
+0

列表獲取隱式轉換爲IEnumerable。據我所知,沒有任何區別。我測試了它,以防萬一我錯了,但使用List時沒有改變。 – Chronicide

0

好了,發現自己的LINQ 2的entites不喜歡的方法(如不知道如何翻譯成SQL)後,我重寫了我的linq是一個非常繁瑣但功能的方式:

var people = from p 
      in  base._objectSet 
      where SearchWords.All(p.GivenName.Contains(word) || p.Surname.Contains(word) || p.(???).Contains(word) || etc.) 
        select p; 

惱人的,但你去。

相關問題