2017-09-20 20 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'。性能不是我的问题,只有大小上限 –