我寫了一個擴展System.Linq
類的方法。我的ContainsAnyWord
方法允許我搜索字符串中的所有單詞而不是將一個字符串與另一個字符串進行比較。如何讓實體的Linq擴展方法可用?
下面是我寫的延長Linq
public static class LinqExtension
{
public static bool ContainsAnyWord(this string value, string searchFor)
{
if (!string.IsNullOrWhiteSpace(value) && !string.IsNullOrWhiteSpace(searchFor))
{
value = value.ToLower();
IEnumerable<string> tags = StopwordTool.GetPossibleTags(searchFor);
return tags.Contains(value);
}
return false;
}
}
這個擴展方法的IEnumerable
對象上的偉大工程的方法。但是,當我想用它IQueryable
對象,我得到以下錯誤
LINQ到實體無法識別方法「布爾 ContainsAnyWord(System.String,System.String)」的方法,而這種方法 不能被翻譯成商店表達。
下面的例子很好,因爲我正在處理一個列表。
using(var conn = new AppContext())
{
var allUsers = conn.Users.GetAll().ToList();
var foundUsers = allUsers.Where
(
user =>
user.FirstName.ContainsAnyWord("Some Full Name Goes Here")
|| user.LastName.ContainsAnyWord("Some Full Name Goes Here")
).ToList();
}
而是因爲我與IQueryable
這給了我上面列出的錯誤工作下面的例子不工作。
using(var conn = new AppContext())
{
var allUsers = conn.Users.Where
(
user =>
user.FirstName.ContainsAnyWord("Some Full Name Goes Here")
|| user.LastName.ContainsAnyWord("Some Full Name Goes Here")
).ToList();
}
我怎麼能解決這個問題,並提供一些IQueryable
對象這種方法嗎?
修訂
基於我在下面得到了反饋,我試圖實現使用IQueryable
這個像這樣
public static IQueryable<T> ContainsAnyWord<T>(this IQueryable<T> query, string searchFor)
{
if (!string.IsNullOrWhiteSpace(searchFor))
{
IEnumerable<string> tags = StopwordTool.GetPossibleTags(searchFor);
return query.Where(item => tags.Contains(item));
}
return query;
}
但是這也給了我一個錯誤
您延長'字符串',而不是'IQueryable'。 –
[這可能是interessting](http://stackoverflow.com/a/24524745/2441442) –
@ChristianGollhardt實現IQueryable不會在Where()中工作。我需要我的代碼在那裏工作,因爲我希望能夠應用一些'OR'運算符邏輯 –