2017-09-20 21 views
0

所以,我有這樣的lambda表達式,它工作得很好對實體框架的字符串大小限制包含條款

list = list.Where(x => x.ListaDocumentoCaixa.Any(d => d.Observacao.Contains(term.Trim()))); 

我必須補充,這列是varchar(6000)場。到目前爲止,正如我所提到的那樣,這一直工作得很好,但最近我遇到了一個問題。似乎如果搜索的詞語從字符串的位置4001開始,則查詢無法將任何內容返回給我。

一些debbuging後,我發現然而,這評價了實體框架生產

-- p__linq__0: 'maria stela gonsa' (Type = String, Size = 4000) 

然後經過一番研究,我發現這是實體的共同行爲的查詢,我不能有這樣的限制應用程序。我的問題是:有沒有辦法改變這種行爲?如果可能,我非常希望避免以純文本的形式編寫此查詢,並使用ExecuteQuery執行此操作。

在此先感謝您的幫助!

+0

你有沒有試過使用'任何'的'第一'巴德?它會增加你的表演。 – PedroSouki

+0

我遇到的問題實際上並不是性能,問題是Entity Framework不會在我的領域的4000位以外進行搜索。性能方面,我根本沒有任何問題 –

+0

但這隻意味着'term'不能超過4000.我可以在一個超過4000個字符的'nvarchar(max)'字段中進行搜索,並且查詢被翻譯爲' LIKE'。你在哪個數據庫(提供者+版本)? –

回答

0

我建議你按照下面的文章,假設你正在使用SQL服務器,關於如何創建一個全文搜索索引,並用C#在實體框架中使用它。

運行LIKE語句(這是Contains()映射到的)在大型varchar字段上效率極低。

https://www.mikesdotnetting.com/article/298/implementing-sql-server-full-text-search-in-an-asp-net-mvc-web-application-with-entity-framework

編輯:鏈接的總結是:

1)創建使用SQL服務器的嚮導領域的全文索引。該全文字段將允許CONTAINS和FREETEXT在整個領域進行搜索,並且效率更高。

2.)編寫一個存儲過程,將有問題的表格加入到自由文本索引的結果中。

3.)使實體框架類表示來自該存儲過程的結果,並使用EF調用並返回這些結果的列表。

+1

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/17391822) – Liam

+0

完成。好建議。 –

+0

這可能在將來很方便,但我真正需要的是將4000的這個大小上限增加到字符串參數的方法。另外,我做了很多挖掘,發現使用'Contains'實際上轉換爲'CHARINDEX'。性能不是我的問題,只有大小上限 –