我正在嘗試針對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窒息它?
你能解釋爲什麼'它不起作用?' –