C# 如何用多词过滤C实体框架

C# 如何用多词过滤C实体框架,c#,entity-framework,C#,Entity Framework,我希望有人能帮助我 我使用实体框架6在c中工作 我需要在我的表产品的描述字段中搜索textbox的值,但文本按任意顺序分开,我可以用我的代码更好地解释: string[] palabras = textBox1.Text.Split(' '); string palabraABuscar = ""; for (int i = 0; i <= palabras.Length - 1; i++) { palabraABuscar = palabras[

我希望有人能帮助我 我使用实体框架6在c中工作

我需要在我的表产品的描述字段中搜索textbox的值,但文本按任意顺序分开,我可以用我的代码更好地解释:

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和lala1盒lala2 程序不得显示计算机lala1或淋浴LA2

在我的代码中,程序只按最后一个单词lala过滤产品,可能会替换第一个,其中,我使用了一个for cicle,因为我不知道要替换多少

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

替换

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


您的currenct代码应该按预期工作,因为该方法使用and添加每个查询。或者您可以尝试另一个选项@Ghasan也在评论中声明:

string[] palabras = textBox1.Text.Split(' ');
query = query.Where(a => palabras.All(p => a.DESCRIPCION.Contains(p)));
如果您的当前代码和此代码都不适用,请检查您是否正确拆分了数据,并确保查询是正确的,直到达到上述代码为止。此外,您还可以检查生成的SQL查询,如:

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

您的currenct代码应该按预期工作,因为该方法使用and添加每个查询。或者您可以尝试另一个选项@Ghasan也在评论中声明:

string[] palabras = textBox1.Text.Split(' ');
query = query.Where(a => palabras.All(p => a.DESCRIPCION.Contains(p)));
如果您的当前代码和此代码都不适用,请检查您是否正确拆分了数据,并确保查询是正确的,直到达到上述代码为止。此外,您还可以检查生成的SQL查询,如:

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

您可能需要全文搜索,而EF不直接支持全文搜索。您将不得不求助于一种变通方法来使其工作。IMO,您当前的代码应按预期工作。您可能需要全文搜索,而EF不直接支持全文搜索。你必须求助于一种变通方法才能使其工作。依我看,你当前的代码应该能按预期工作。你的答案请记住,我可以检查生成的SQL并确认我的代码能工作。但我仍然无法解决我的问题,我尝试使用我的代码并获得以下sql代码:{SELECTProject1.IDPRODUCTO,Project1.descripionfrom producto AS Project1,其中1=Project1.ESTADO和Project1.descripionlike@p_uulinq_u0和Project1.description LIKE@p_ulinq_u1 ORDER BY Project1.IDPRODUCTO ASC}我看不到错误:/i我的程序仍然显示产品,如仅使用用户输入的最后一个字进行过滤。那么问题不在代码中,请检查参数p_ulinq_u0和p_ulinq_u1,然后尝试在databas@alexisenp中执行该查询。您知道为什么生成的sql代码会显示该参数而不是值吗?以及如何查看该参数的值??:S@Alexisenp,它们的值通常显示在查询下面。-p__linq___0:'lala1'Type=Object-在2016年8月18日11:27:55+04:00执行-在43毫秒内完成,结果:OracleDataReader最终我修复了由于您的帮助,生成p_linq_0和p_linq__0的两个变量具有相同的值我不知道为什么,我打印了变量palabraABuscar,并且值是正确的,最后,我修改了如下代码:`string[]palabras=textBox1.Text.Split';对于int i=0;i a.descripion.containerspalabraabuscar;}`我在for cicle中声明了变量,它按照我的预期工作。谢谢你的帮助:请记住,我可以检查生成的SQL,并确认我的代码可以正常工作。但我仍然无法解决我的问题,我尝试使用我的代码并获得以下sql代码:{SELECTProject1.IDPRODUCTO,Project1.descripionfrom producto AS Project1,其中1=Project1.ESTADO和Project1.descripionlike@p_uulinq_u0和Project1.description LIKE@p_ulinq_u1 ORDER BY Project1.IDPRODUCTO ASC}我看不到错误:/i我的程序仍然显示产品,如仅使用用户输入的最后一个字进行过滤。那么问题不在代码中,请检查参数p_ulinq_u0和p_ulinq_u1,然后尝试在databas@alexisenp中执行该查询。您知道为什么生成的sql代码会显示该参数而不是值吗?以及如何查看该参数的值??:S@Alexisenp,它们的值通常显示在查询下面。-p__linq___0:'lala1'Type=Object-在2016年8月18日11:27:55+04:00执行-在43毫秒内完成,结果:OracleDataReader最终我修复了由于您的帮助,生成p_linq_0和p_linq__0的两个变量具有相同的值我不知道为什么,我打印了变量palabraABuscar,并且值是正确的,最后,我修改了如下代码:`string[]palabras=textBox1.Text.Split';对于int i=0;i a.descripion.containerspalabraabuscar;}`我在for cicle中声明了变量,它按照我的预期工作。Thx感谢您的帮助:抱歉,伙计们,当我使用该代码时,我得到了一个错误,我认为应该是palabras as@AdilMammadov:InnerException{您的SQL语法中有一个错误;请查看与您的MariaDB服务器版本对应的手册,以了解在“%s%或案例W”附近使用的正确语法
当Extent1.description像%s%1时,当Extent1。'在第16行}System.Exception{MySql.Data.MySqlClient.MySqlException}我不知道为什么:/,我仍然想弄清楚为什么对我来说像一个MariaDB bug。能否尝试运行query.ToList.Where?如果这样做有效,那么错误应该出现在将linq转换为SQLQ的框架中。当我使用该代码时,我得到的错误应该是palabras as@AdilMammadov:InnerException{您的SQL语法有错误;请检查与您的MariaDB服务器版本相对应的手册,以了解在“%s%附近使用的正确语法,或者在Extent1.description类似于%s%时使用CASE,然后在Extent1时使用1。'在第16行}System.Exception{MySql.Data.MySqlClient.MySqlException}我不知道为什么:/,我仍然在努力找出为什么对我来说像是一个MariaDB bug。你能试着运行query.ToList.Where吗?如果这样做有效,错误应该在将linq转换为sql的框架中