2014-04-22 88 views
7

我已經通過執行這個方法我得到異常時使用的EntityFramework像下面LINQ到實體無法識別方法「的Int32的IndexOf(System.String,System.StringComparison)」的方法

GroupMaster getGroup = null; 
getGroup = DataContext.Groups.FirstOrDefault(item => keyword.IndexOf(item.Keywords,StringComparison.OrdinalIgnoreCase)>=0 && item.IsEnabled) 

執行LINQ查詢像下面

LINQ實體無法識別方法「的Int32的IndexOf(System.String,System.StringComparison)」方法,和這種方法 不能被翻譯成表達商店。

載有()默認情況下,所以我又需要轉換爲lower.Is有什麼方法檢查除含有方法沒有任何解決的indexOf方法問題的方法以外的字符串匹配敏感的方法?

+0

如果您暴露DataContext.Groups對象的相關字段,我可能會改進答案。 –

+4

'Contains'被轉換爲生成的SQL查詢中的'LIKE'語句。事實上'LIKE'是否區分大小寫或不區分大小寫取決於數據庫配置。更改數據庫以執行不區分大小寫的字符串比較並使用「Contains」。 – MarcinJuraszek

+0

它是一個實體框架datacontext,其中組是DbSet JEMI

回答

4

在這裏你確實只有四個選項。

  1. 更改全局數據庫的排序規則。這可以通過幾種方式完成,一個簡單的谷歌搜索應該顯示它們。
  2. 更改各個表或列的排序規則。
  3. 使用存儲過程並在查詢中指定COLATE語句
  4. 執行查詢並返回一大組結果,然後在內存中使用Linq過濾到對象。

4號不是一個好的選擇,除非你的結果集非常小。如果你不能改變數據庫,#3是很好的(但是你不能使用Linq)。

數字1和2是您需要對整個數據模型做出的選擇,或者您只希望在特定字段上進行操作。

更改服務器歸類: http://technet.microsoft.com/en-us/library/ms179254.aspx

更改數據庫排序規則: http://technet.microsoft.com/en-us/library/ms179254.aspx

更改列排序規則: http://technet.microsoft.com/en-us/library/ms190920(v=sql.105).aspx

在存儲過程中使用分頁聲明: http://technet.microsoft.com/en-us/library/ms184391.aspx

3

相反,你可以使用降低的情況下面這個方法:

var lowerCaseItem = item.ToLower(); 

如果你的產品string型。這可能會讓你通過這個例外。

+0

通過使用string.contains()。toLower()我可以解決這個問題,但toLower再次是一個重載。 string.indexof我可以檢查大小寫。我期待着除了我看到的Contains方法 – JEMI

+0

以外,但我猜測你正在經歷錯誤的方向。 @ MarcinJuraszek的評論不會做詭計嗎? –

+0

除了解決這個問題以外,我的疑惑是Inside contains方法我認爲他們正在檢查相同的功能索引,那麼爲什麼entityframework會拋出異常? – JEMI

3

The IndexOf方法String類的不會被實體框架的認可,請更換此功能SQLfunctionCanonical functions

您還可以幫助從here也許here

您可以使用下面的代碼示例:

的DataContext .Groups.FirstOrDefault(項目=> System.Data.Objects.SqlClient.SqlFunctions.CharIndex(item.Keywords,關鍵字)。價值> = 0 & & item.IsEnabled)

0

Erik Funkenbush的答案在查看數據庫問題時非常有效。但是我覺得,如果你想有效地遍歷關鍵字,你需要一個更好的結構來保存有關關鍵字的數據。

注意,這個答案並非是更好,它的目的是解決在數據模型中的問題,而不是讓環境適應當前(顯然是有缺陷的,因爲存在這樣的問題)的數據模型你有。

我的主要建議,無論時間限制(我意識到這不是最簡單的解決方法)是爲關鍵字添加一個單獨的表(與其相關類具有多對多關係)。

[GROUPS] * ------- * [KEYWORD] 

這應該允許你搜索的關鍵詞,只有然後檢索具有該關鍵字與它(基於ID,而不是複合字符串)的項目。

int? keywordID = DataContext.Keywords.Where(x => x.Name == keywordFilter).Select(x => x.Id).FirstOrDefault(); 

if(keywordID != null) 
{ 
    getGroup = DataContext.Groups.FirstOrDefault(group => group.Keywords.Any(kw => kw.Id == keywordID)); 
} 

但我完全可以理解,如果這種類型的修復在當前項目中不再可能了。不過,我想提一下它,以防將來有人在這個問題上出現問題,並且仍然有改進數據結構的選擇。

相關問題