2016-08-18 72 views
1

我希望有人能helpme IM工作在C#与实体框架6如何通过多个单词来过滤C#实体框架

我需要在我的表“产品”一个“描述”字段来搜索文本框的值,但在任何顺序文本由单独的,我可以解释我的代码更好:

string[] palabras = textBox1.Text.Split(' '); 
string palabraABuscar = "";      
for (int i = 0; i <= palabras.Length - 1; i++) 
{ 
palabraABuscar = palabras[i]; 
query = query.Where(a => a.DESCRIPCION.Contains(palabraABuscar)); 
} 

的想法是,如果用户输入“lala1 lala2”包含两个词程序过滤器的所有产品,例如:

程序必须显示产品“摄像机lala2 with lala1”和“lala1 BOX lala2” 程序不得显示“Computer lala1”或“lala2”

使用我的代码,程序仅通过最后一个单词(“lala”)过滤产品也许替换第一个地方,我使用了cicle因为我不知道有多少

+0

您可能需要全文搜索,而不直接由EF支持。你将不得不采取一种解决方法,使其工作。 –

+0

IMO,您当前的代码应该按预期工作。 –

回答

3

你currenct代码应该按预期工作,因为Where方法会将每个查询添加到and。或者你可以尝试另一种选择(@Ghasan也评论说):

string[] palabras = textBox1.Text.Split(' '); 
query = query.Where(a => palabras.All(p => a.DESCRIPCION.Contains(p))); 

如果和你的当前代码,也不是这对你的作品,然后检查是否正确分割数据,并确保query是正确的,除非你达到以上代码。此外,您可以检查生成的SQL查询,如:

context.Database.Log = Console.WriteLine; // Or something similar. 
+0

你的答案我可以检查生成的SQL并确认我的代码应该可以工作 但我仍然无法解决我的问题,我试着用我的代码('='Project1'.'ESTADO')AND('Project1');这个sql代码: {SELECT'Project1'.'IDPRODUCTO','Project1'.'DESCRIPCION'FROM' producto' AS' Project1' WHERE((1 ='Project1'.'ESTADO')AND('Project1' .'DESCRIPCION' LIKE @ p__linq__0))AND('Project1'.'DESCRIPCION' LIKE @ p__linq__1)ORDER BY'Project1'.'IDPRODUCTO' ASC} 我看不到错误:/ 我的程序仍然显示产品就像过滤只有用户输入的最后一个字 –

+0

然后问题不在你的代码中,检查参数'p__linq__0'和'p__linq__1'并尝试在数据库中执行该查询@Alexisenp –

+0

你知道为什么生成的sql代码显示我的参数,而不是价值? 以及如何查看该参数的值?:S –

1

只需更换

query = query.Where(a => a.DESCRIPCION.Contains(palabraABuscar)); 

query = query.Where(a => palabraABuscar.All(x => a.DESCRIPCION.Contains(x)); 
+0

对不起,当我使用该代码时,我得到的错误(我认为应该是palabras作为@AdilMammadov): InnerException \t {“您的SQL语法有错误;请查看右边对应于您的MariaDB服务器版本的手册('Extent1'.'DESCRIPCION' like%s%)THEN(1)WHEN('Extent1'。'at line 16“} \t System.Exception {MySql.Data .MySqlClient.MySqlException} 我不知道为什么:/,我仍然试图找出为什么 –

+0

看起来像一个MariaDB的bug,你可以尝试运行'query.ToList()。Where('?如果这个工作,错误应该是在框架中,将linq转换为sql – fubo